初遇分治算法——归并排序

时间复杂度: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);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子砰砰枪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值