【算法】 各种排序算法比较

【冒泡排序】
思想:一共进行n轮,每一轮都让最小的数字往上冒。即:若arr[i+1]<arr[i],则交换arr[i+1]和arr[i]。
平均时间复杂度:O(n^2)
最好情况:O(n^2)
最坏情况:O(n^2)
优点:稳定
缺点:慢

【插入排序】
思想:在一个已经有序的小序列的基础上,一次插入一个元素。
平均时间复杂度:O(n^2)
最好情况:O(n)
最坏情况:O(n^2)
优点:稳定
缺点:慢

【选择排序】
思想:第一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
平均时间复杂度:O(n^2)
最好情况:O(n^2)
最坏情况:O(n^2)
优点:简单
缺点:不稳定。对于稳定性的度量,其准则是:所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。

【快速排序】
思想:快速排序的算法就是以每轮都以某种方式选择一个基准数据,然后为基准数据找到其正确的索引位置。具体在我的另一篇博客中有详细介绍:快速排序原理及Python代码实现
平均时间复杂度:O(nlogn)
最好情况:O(nlogn)
最坏情况:O(n^2)
优点:快速
缺点:不稳定
应用场景:求数组中第k小的数——将数组中某一个元素m作为划分依据,即m=arr[0]。若m前面的元素个数大于k,则第k小的数一定在m前面的元素中,这时我们只需要继续在m前面的元素中找第k小的数;若m前面的元素小于k,则第k小的数一定在m后面的元素中,这时我们只需要在m后面的元素中找第k小的数。

【堆排序】
思想:堆排序的大体流程主要分为两步:第一步是建立初始的大根堆,第二步是将堆顶元素与当前arr的末尾元素交换,使末尾元素最大。重复这两个步骤,直到整个序列有序。具体在我的另一篇博客中有详细介绍:堆排序原理及Python代码实现
平均时间复杂度::O(nlogn)
最好情况:O(nlogn)
最坏情况:O(nlogn)
优点:快速
缺点:不稳定
应用场景:寻找M个数中的前K个最小的数并保持有序。

【归并排序】
思想:1⃣️分解:以mid = (low + high)/2为分裂点,将当前区间一分为2;2⃣️求解:递归地对两个子区间进行归并排序,递归的终结条件是子区间长度为1;3⃣️合并:将有序的两个子区间归并为一个有序的区间。在合并时,所采用的策略是:设定两个指针,最初位置分别为两个已经排序序列的起始位置;比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置,重复这个过程直到某一指针达到序列尾;最后将另一序列剩下的所有元素直接复制到合并序列尾。具体在我的另一篇博客中有详细介绍:归并排序原理及Python代码实现
平均时间复杂度::O(nlogn)
最好情况:O(nlogn)
最坏情况:O(nlogn)
优点:快速、稳定
应用场景:若n较大,并且要求排序稳定,则可以选择归并排序。

【希尔排序】
思想:希尔排序是一种插入排序算法,其核心思想是缩小增量排序。希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1(最后一趟是直接插入排序)。具体在我的另一篇博客中有详细介绍:希尔排序原理及Python代码实现
平均时间复杂度::O(n^1.3)
最好情况:O(n)
最坏情况:O(n^2)
优点:快速
缺点:不稳定
应用场景:比较在希尔排序中是最主要的操作,而不是交换。用已知最好的步长序列的希尔排序比直接插入排序要快,甚至在小数组中比快速排序和堆排序还快,但在涉及大量数据时希尔排序还是不如快排。

各种排序算法的应用场景:

  1. 当n <= 50时,适合适用直接插入排序和简单选择排序,如果元素包含的内容过大,就不适合直接插入排序,因为直接插入排序需要移动元素的次数比较多。
  2. 当数组基本有序的情况下适合使用直接插入排序和冒泡排序,它们在基本有序的情况下排序的时间复杂度接近O(n)。
  3. 若n较大,则应采用时间复杂度为O(nlogn)的排序方法:快速排序、堆排序或归并排序。
    当待排序的关键字是随机分布、较复杂时,快速排序的平均时间最短。
    堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
    若要求排序稳定,则可选用归并排序。
  4. 快速排序,归并排序,希尔排序,堆排序平均时间复杂度都是O(nlogn)其中,快速排序是最好的,其次是归并和希尔,堆排序在数据量很大时效果明显(堆排序适合处理大数据)。
    大数据处理的一个例子:找出一千万个数中最小的前一百个数。思路:建立一百个节点的大顶堆,首先将前一百个数放入堆中,之后每放入一个数就删除一个堆顶元素,最后剩下的就是最小的一百个数。
    这四种排序可看作为“先进算法”,其中,快排效率最高(大数据就不行了,而且速度有概率性),但在待排序列基本有序的情况下,会变成冒泡排序,接近O(n2)。
    希尔排序对增量的标准没有较为满意的答案,增量对性能会有影响。
    归并排序效率非常不错,在数据规模较大的情况下,比希尔排序和堆排序要好。
    多数先进的算法都是因为跳跃式的比较,降低了比较次数,但牺牲了排序的稳定性。
  5. 希尔排序:n较小时较好,且关键字较为复杂较好。

参考资料:
1.超详细的八大排序算法的各项比较以及各自的特点
2.各种排序算法比较

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值