各种排序算法总结

各种排序算法总结


1 算法类型

这里写图片描述

2 算法性能分析

排序算法平均时间复杂度最坏情况时间复杂度最佳情况时间复杂度稳定性空间复杂度约束条件
直接插入排序O(n2)O(n2)O(n)c
希尔插入与增量有关O(n2)O(n)c
简单选择排序O(n2)O(n2)O(n2)c
堆排序O(nlogn)O(nlogn)O(nlogn)c
冒泡排序O(n2)O(n)O(n2)c
快速排序O(nlogn)O(n2)O(nlogn)c
归并排序O(nlogn)O(nlogn)O(nlogn)n
桶排序O(n)O(n)O(n)n+k+c数据均匀分布
计数排序O(n+k)O(n+k)O(n+k)n+k+c数据需要在一定范围内
基数排序O(n)O(n)O(n)n+k+c

注:其中c为不大于10的非负数,n为数据长度,k为数据的最大值。

3 算法极端性能

  1. 原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至 O(n)

  2. 原表有序或基本有序时,快速排序却相反,将退化为冒泡排序,时间复杂度提高为 O(n2)

  3. 原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。

4 稳定性

排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序, 这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对 次序发生了改变,则称该算法是不稳定的。

稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,可以避免多余的比较。

稳定的排序算法:冒泡排序、直接插入排序、归并排序和基数排序;

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

5 算法选择

选择排序算法的依据:影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。一般而言,需要考虑的因素有以下四点:

  1. 待排序的记录数目n的大小;

  2. 记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小;

  3. 关键字的结构及其分布情况;

  4. 对排序稳定性的要求。

假设待排序元素的个数为n:

  1. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序;

    • 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;

    • 堆排序 : 如果内存空间允许且要求稳定性的;

    • 归并排序:它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。

  2. 当n较大,内存空间允许,且要求稳定性时使用归并排序;

  3. 当n较小,可采用直接插入或直接选择排序;

    • 直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数;

    • 直接选择排序:当元素分布有序,如果不要求稳定性,可选择直接选择排序。

  4. 一般不使用或不直接使用传统的冒泡排序。

  5. 基数排序是一种稳定的排序算法,但有一定的局限性:

    1. 关键字可分解。

    2. 记录的关键字位数较少,如果密集更好

    3. 如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值