分治排序(归并排序)

       思路借鉴的,具体实现方法自己想的,考虑到用队列存储每次小部分排序时的序列也许可行,并且这方法可以很巧妙的在把队列中数据返回给数组时将其顺便清空,不过存取仍然是很浪费时间的,只是控制在了常数级别倍数差时间而已,复杂度为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();
		}
	}
}

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

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

猜你喜欢

转载自blog.csdn.net/LittleWhiteLv/article/details/81101522