栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《算法导论》初遇分治算法——归并排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《算法导论》初遇分治算法——归并排序

时间复杂度:O(nlogn)

许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。这些算法典型地遵循分治法的思想:将几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。

分治模式在每层递归时都有三个步骤:
1.分解原问题为若干子问题,这些子问题时原问题的规模较小的实例。
2.解决这些子问题,递归地求解各子问题。然后,若子问题的规模足够小,则直接求解。
3.合并这些子问题的解成原问题的解。

//如果给你两个分别有序的数组,你该怎么排?
//a数组分成两个部分:a[left]-a[mid]  a[mid+1]-a[right]
void merge(int temp[], int a[], int left, int mid, int right)
{
	int k = left;
	int i = left;
	int j = mid+1;
	while (i <= mid && j <= right)
	{
		if (a[i] <= a[j])
		{
			temp[k++] = a[i++];
		}
		else
		{
			temp[k++] = a[j++];
		}
	}
	while (i <= mid)
	{
		temp[k++] = a[i++];
	}
	while (j <= right)
	{
		temp[k++] = a[j++];
	}
	//排序之后说明a数组的left到right 是正序
	for (i = left; i <= right; i++)
	{
		a[i] = temp[i];
	}
}

//递归
void merge_sort(int temp[],int a[], int left, int right)
{
	//先写递归出口
	if (left == right)
	{
		return;
	}
	//再写递归式子
	else
	{
		int mid = (left + right) / 2;
		//递归调用左侧
		merge_sort(temp, a, left, mid);
		//递归调用右侧
		merge_sort(temp, a, mid+1, right);
		//此时左侧和右侧已经有序,合并两个有序的数组
		merge(temp, a, left, mid, right);
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296707.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号