自下而上与自上而下的归并排序

自下而上与自上而下的归并排序

问题来源:我一开始也没有注意到这一点,直到我做了这个题

这个题目中所描述的归并排序是这样的:在这里插入图片描述
也就是说,对于十个元素的情况,比如
3 1 2 8 7 5 9 4 6 0
相邻元素两两结合后,就成了
(3 1)(2 8)(7 5)(9 4)(6 0)
一次排序后为
(1 3)(2 8)(5 7)(4 9)(0 6)
二次排序后为
(1 2 3 8)(4 5 7 9)(0 6)
三次排序后为
(1 2 3 4 5 7 8 9)(0 6)
四次排序后为
(0 1 2 3 4 5 6 7 8 9)

以上为“自下而上”的归并排序

但是!!!

如果为“自上而下”的归并排序

(3 1 2 8 7 5 9 4 6 0)
第一次递归下去
(3 1 2 8 7)(5 9 4 6 0)
第二次递归下去
(3 1 2)(8 7)(5 9 4)(6 0)
第三次递归下去
(3 1)(2)(8 )(7)(5 9)(4)(6)(0)
第四次递归下去
(3)(1)(2)(8)(7)(5)(9)(4)(6)(0)
第一次回溯(一次排序后为)
(1 3)(2)(7 8)(5 9)(4)(0 6)
第二次回溯(二次排序后为)
(1 2 3)(7 8)(4 5 9)(0 6)
第三次回溯(三次排序后为)
(1 2 3 7 8)(0 4 5 6 9)
第四次回溯(四次排序后为)
(0 1 2 3 4 5 6 7 8 9)

我们不难发现,两次过程中的数组排列情况是不同的

因此,在归并排序方面,要认识到自上而下与自下而上的区别

---------------------------------------------------------------------------------------------------------------------

代码实现

void Merge_sort_downtoup(){
	int t = 2;//最小分割单元 
	while(t <= n){
		for(int i = 1; i <= n; i += t){
			sort(a + i, a + min(i + t, n + 1));//注意sort的使用 
		}
		/*这里可以进行一些操作 */ 
		t *= 2;
	}
	return ;
}
void Merge_sort_uptodown(int l, int r){
	if(l == r) return ;
	int mid = (l + r) / 2;
	Merge_sort_uptodown(l, mid);
	Merge_sort_uptodown(mid + 1, r);
	int i = l, j = mid + 1, t = l;
	while(i <= mid && j <= r){
		if(a[i] <= a[j]){
			k[t] = a[i];
			t ++;
			i ++;
		}
		else{
			k[t] = a[j];
			t ++;
			j ++;
		}
	}
	while(i <= mid){
		k[t] = a[i];
		t ++;
		i ++;
	}
	while(j <= r){
		k[t] = a[j];
		t ++;
		j ++;
	}
	for(int i = l; i <= r; ++ i)
		a[i] = k[i];
	return ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Crer_lu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值