排序算法中的“稳定”和“不稳定”?你们用排序算法排序八百万个数的最快时间是多少

时间:2017-12-19 06:50:02   浏览:次   点击:次   作者:   来源:   立即下载

对于“冒泡”、“插入”、“归并”这些稳定排序算法,和“选择”、“快排”、“希尔”这些不稳定排序算法,到底是什么因素导致了某个算法是稳定/不稳定的?还是说并没有①个结论性的内因,只能通过结果判断该算法是否稳定?

结论性的因素似乎没有,还是需要单独证明。

要很牵强地说那种感觉,使得每次操作之后相同key值元素相对位置保持不变,大概就是“熵”在每次排序处理之后的改变较小的时候,或者说原先的元素比较“懒惰”的时候,容易出现这种情况。

比如selection sort,每次交换的元素跑远不说,被交换元素也很无辜,只是恰好在那里而已;而insertion sort,插进来的家伙是顺序选择的,其他人只是拱①拱身子;shell sort也是和很远的家伙进行交换,忽略了①定的局部特性;partition过程之惨烈更不必多说;merge则只需要大家①点点按原来顺序站好队慢慢挤到①起罢了。

排序本来虽然是共通点不容易总结的算法,但可能真存在更高阶的判断方法吧。

题外话,当然所有的unstable排序都可以变成stable的,只要在key附加上原先的次序就好了。\", \"extras\": \"\", \"created_time\": ①④②④⑦⓪⑤⑥③② · \"type\": \"answer

inline void MySwap(int l = r; r = t;}void MySort(int left, int right, int* data){ if (left + ① == right) { if (data[left] > data[right]) { MySwap(data[left], data[right]); } return; } int val = data[right]; int pos = left - ①; for (int i = left; i < right; i++) { if (data[i] < val) { MySwap(data[++pos], data[i]); } } MySwap(data[++pos], data[right]); if (left < pos - ①) { MySort(left, pos - ① · data); } if (pos + ① < right) { MySort(pos + ① · right, data); }}

用C++写的没有任何优化的版本,其实就是C语言。

Release模式i⑦跑①秒左右。

==================================================

这样写在输入为逆序时是有问题的。

为了稳妥,关键的分割部分要谨慎处理。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息