参考了 十大排序从入门到入赘 - 力扣(LeetCode)有时间想更全面了解可以看看这里。
逆序:排序后的数组一般是从小到大[0,1,2,3] 当数组为[3,1,2,0],称数组中有逆序,比如3和1、3和2、3和0、1和0、2和0。排序完成后数组的逆序对数量应该为0,所以排序其实是消除逆序对的过程。
一、冒泡排序:冒泡排序始终只交换相邻元素,比较对象大小相等时不交换,相对位置不变,故稳定。
优化:提前结束优化和冒泡界优化。
提前结束优化:当前轮没有发生交换,则视为排序完成不再执行循环
冒泡界优化:用Lastindex记录上一轮循环已排序的数组的下标,
二、选择排序:使用min_i记录未排序数组中的最小值,每一次循环寻找一个。不稳定,
例: [4,4,2] 。第一轮交换第一个 4 和 2,则两个 4 位置关系改变。
优化:双元选择优化
三、插入排序:依次将未排序的数遍历比较,插入已排序的数组,稳定
优化:折半插入,通过二分查找找到应该插入的位置。
四、希尔排序:对间隔为gap的数字进行排序,改变gap值,gap有不同的变化方式。不稳定
五、归并排序:将数组划分为左右两个子数组,直到长度为1,然后在合并中排序,稳定
六、快速排序:在数组中确定pivot作为比较的标准,比pivot小的放在左侧,比pivot大放在右侧。不稳定
七、堆排序:构建大顶堆。每次交换堆顶和堆底元素之后调用一次下滤保证堆是大顶堆。不稳定
八、计数排序:使用计数数组记录arr中的数组出现的次数,完成后依次输出计数数组的数组。稳定性取决于是否使用稳定性优化(不太理解)
九、基数排序:记录数组中最大的数的位数,依次对位进行计数排序。稳定
十、桶排序:按照一定的规律将待排数组划分到不同的桶(比如数组),每个桶单独排序,排序稳定性取决于排序方法。