-
比较器:定义一个比较器函数,如果返回负数,认为第一个参数应该排在前面,如果返回是正数,认为第二个参数应该排在前面,如果返回0,认为谁放前面无所谓。
可用于 基于比较的排序。 -
桶排序思想下的排序
- 桶排序思想下的排序都不是基于比较的排序
2)时间复杂度为O(N), 额外空间复杂度为O(N)
3)应用范围有限,需要样本的数据状况满足桶的划分。
例子:一个数组 里面放的是员工的年龄,用O(N)的时间复杂度排序。
方法:生成一个201的数组,里面值为0-200. 查询数组里面的值,遇到某个值 对应的位置就加1. 最后根据每个值 有多少个,直接打印结果。计数排序,最大和最小差值不能太大。
基数排序, 必须是十进制数,必须基于具体的业务和数据状况排序。
- 桶排序思想下的排序都不是基于比较的排序
def countSort(data):
M = max(data)
-
排序的稳定性
选择排序: 时间复杂度O(N^2),空间复杂度O(1),不稳定,比如 3 3 3 3 1–>排位置0时,交换1和3. 3不稳定
冒泡排序: 时间复杂度O(N^2),空间复杂度O(1), 稳定。 相等不交换时稳定
插入排序:时间复杂度O(N^2),空间复杂度O(1),稳定。
归并排序:时间复杂度O(NlogN), 空间复杂度O(N), 稳定。merge时,相等时 copy左侧的
快速排序:时间复杂度O(NlogN), 空间复杂度O(logN),不稳定。 partition时 当前数大于划分值时 交换 当前数和 大于区域前一个数。
堆排序:时间复杂度O(N*logN), 空间复杂度O(1),不稳定。
非基于比较的排序(计数排序、基数排序) 都是稳定。不存在时间复杂度O(N*logN), 空间复杂度低于O(N)的稳定的排序。
-
工程上的排序
计数类型的 不在乎稳定性的 用快排。时间复杂度低,并且常数项比较低。
集合O(N*logN)和O(N^2)的排序。
比如 len(data)<=47 直接插入排序,因为插入排序的常数项比较低。
len(data)>47时 用快排。 因为调度快。
非基础类型,一般不用 快排,因为关注稳定性。