排序算法中的“稳定”和“不稳定”?你们用排序算法排序八百万个数的最快时间是多少
对于“冒泡”、“插入”、“归并”这些稳定排序算法,和“选择”、“快排”、“希尔”这些不稳定排序算法,到底是什么因素导致了某个算法是稳定/不稳定的?还是说并没有①个结论性的内因,只能通过结果判断该算法是否稳定?
结论性的因素似乎没有,还是需要单独证明。
要很牵强地说那种感觉,使得每次操作之后相同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⑦跑①秒左右。
==================================================
这样写在输入为逆序时是有问题的。
为了稳妥,关键的分割部分要谨慎处理。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息