基础算法3 - 桶排序和排序算法总结

  1. 比较器:定义一个比较器函数,如果返回负数,认为第一个参数应该排在前面,如果返回是正数,认为第二个参数应该排在前面,如果返回0,认为谁放前面无所谓。
    可用于 基于比较的排序。

  2. 桶排序思想下的排序

    1. 桶排序思想下的排序都不是基于比较的排序
      2)时间复杂度为O(N), 额外空间复杂度为O(N)
      3)应用范围有限,需要样本的数据状况满足桶的划分。

    例子:一个数组 里面放的是员工的年龄,用O(N)的时间复杂度排序。
    方法:生成一个201的数组,里面值为0-200. 查询数组里面的值,遇到某个值 对应的位置就加1. 最后根据每个值 有多少个,直接打印结果。

    计数排序,最大和最小差值不能太大。

    基数排序, 必须是十进制数,必须基于具体的业务和数据状况排序。

def countSort(data):
	M = max(data)
	
  1. 排序的稳定性

    选择排序: 时间复杂度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(N
    logN), 空间复杂度O(logN),不稳定。 partition时 当前数大于划分值时 交换 当前数和 大于区域前一个数。
    堆排序:时间复杂度O(N*logN), 空间复杂度O(1),不稳定。
    非基于比较的排序(计数排序、基数排序) 都是稳定。

    不存在时间复杂度O(N*logN), 空间复杂度低于O(N)的稳定的排序。

  2. 工程上的排序
    计数类型的 不在乎稳定性的 用快排。时间复杂度低,并且常数项比较低。
    集合O(N*logN)和O(N^2)的排序。
    比如 len(data)<=47 直接插入排序,因为插入排序的常数项比较低。
    len(data)>47时 用快排。 因为调度快。
    非基础类型,一般不用 快排,因为关注稳定性。

发布了28 篇原创文章 · 获赞 5 · 访问量 4323

猜你喜欢

转载自blog.csdn.net/m0_37531129/article/details/104128749
今日推荐