分治排序(归并排序)

       思路借鉴的,具体实现方法自己想的,考虑到用队列存储每次小部分排序时的序列也许可行,并且这方法可以很巧妙的在把队列中数据返回给数组时将其顺便清空,不过存取仍然是很浪费时间的,只是控制在了常数级别倍数差时间而已,复杂度为O(nlogn),实际试了一下,排序一千万个数,基本这样子:

 

一千万个数排序花了大约10秒。

1e7大约是2的23次方,也就是说计算量为23*1e7=2*1e8,也就是大约两秒,考虑到每次循环至少也有5次计算量,而电脑现在性能稍微优于1e8次计算,可见队列存取所消耗的时间是极少的,并没有太大影响,所以还是有点使用价值的。

具体算法代码示例:

void sort1(int x,int y) {    //排序上下限
	queue <int> dui;
	if(x==y) return ;    //当二分到只有1个数时return
	else {
        int l=x,r=(x+y)/2+1;    //左右两段的首位
		sort1(x,r-1);    //两个子序列执行相同操作
		sort1((r,y);
		while(!(l>(x+y)/2||r>y)) {
			dui.push(min(a[l],a[r]));
			if(a[l]<a[r]) {    //不断把排好序的两个序列首位比较大小,选出最小值
				l++;
				if(l>(x+y)/2) {    //当其中一侧全选完时,另一侧直接全部出来即可,下同
					while(1) {
						dui.push(a[r]);
						r++;
						if(r>y) break;
					}
				}	
			}
			else {
				r++;
				if(r>y) {
					while(1) {
						dui.push(a[l]);
						l++;
						if(l>(x+y)/2) break;
					}
				}
			}	
		}
		for(int i=x;i<=y;i++) {    //把队列中排好序的数导出
			a[i]=dui.front();
			dui.pop();
		}
	}
}

最开始写了半天老是出错,后来发现队列居然是先进先出。。。。我真的像个傻子

思路就是把任务二分变成两个小任务,直到只剩下一个数,如此递归,代码里的注释也很全很详细了,没什么能细说的了,最后再放一张过程说明图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值