算法 - 排序算法的稳定性

排序算法的稳定性

排序的稳定性,指原有数据相同值的原始次序不变。

可以:

  • 冒泡排序遇到相等的数不交换即可做到稳定。
  • 插入排序,遇到相等的数即停止比较,插入数组。
  • 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定。

不可以:

  • 选择排序不能做到稳定性,选择数值的时候交换数字是会打乱原始的次序。
  • 随机快排不具有稳定性,因此荷兰国旗问题也是不能做到稳定性的。
  • 堆排序。

稳定性的意义:

  • 现实工程中需要保持上一次排序时遗留的信息,比如学校的成绩排序,第一次查询以成绩高低排序,第二次查询以班级排序,如果排序算法具有稳定性,就可以保留上一次查询的信息,那么第二次查询得到的结果就是以班级和成绩高低两项指标排序的成绩。

排序总结

工程上的排序算法是综合排序:先调用快排或归并排序,再调用插入排序。

在样本量小于 60 的时候使用插入排序,对比冒泡排序和选择排序,插入排序的时间复杂度是受数据状况影响的,范围是 [O(n), O(n^2)] , 而且其代码简洁,常数项低;

样本量大于 60 的时候,在能使用快排的场景下,如不用区分数据的差异,不追求稳定性,这时选用快排,因为其非常简洁,操作少,常数项低;需要区分数据的差异,要求算法具有稳定性的时候使用归并排序。

工程中需要将快排和归并排序的递归调用部分改写成非递归的调用。

归并排序空间复杂度是 O(N),可以变成 O(1),使用的是“内部缓存法”。还有一种叫原地归并排序,也是将空间复杂度变成 O(1),但是时间复杂度变成 O(n^2),这时候使用归并排序的意义就不是很重要了。

快排是可以变成具有稳定性的,很难,具体看“01 stable sort”,属于论文级别的算法了。有一类题目,要求将数组的数按照奇偶分排两侧,保持稳定性,说的就是“01 stable sort”。

猜你喜欢

转载自www.cnblogs.com/chenxianbin/p/11896787.html