八大排序算法的性质及特性比较

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 总结图
  • 一、排序算法的时空复杂度、稳定性
    • 1.时间复杂度
    • 2.空间复杂度
    • 3.稳定性
  • 二、排序趟数是否与序列的原始状态有关
  • 三、比较次数是否与序列的原始状态有关
  • 四、一趟是否能确定一个元素最终位置
  • 总结


前言

        肯定有不少小伙伴在考研路上,在数据结构这门课上有不少疑惑(我也是55)。本人刚学完内部排序八大算法,尤其是在做完王道课后题后,想根据自己学习的知识对课后题中出现容易混淆且不容易理解的知识点小小的总结,主要是在八大排序的几项性质的比较和归纳。如有不对地方,敬请大家指正。


总结图

一、排序算法的时空复杂度、稳定性

1.时间复杂度

         从时间复杂度上来看,直接插入排序冒泡排序简单选择排序平均时间复杂度都为O(n²),直接插入排序冒泡排序最好情况下可以达到O(n)的数量级,而简单选择排序都是O(n²)希尔排序在某个范围内可以达到O(n^1.3),最坏情况下是O(n²)。(参照王道考研书上的内容,我也看过本站内好多作者对希尔排序时间复杂度的赋值,只有最坏情况下O(n²)是可以确定的,其他两种情况有好多不同的版本。快速排序,首先,快速排序是所有内部排序算法中平均性能最优的排序算法,也是考研重点考察的一个算法,其是基于分治的思想,通过递归实现排序,平均性能可以到达O(nlog₂n),在实际应用中常常优于其他算法。(最起码在LeetCode中好多题都是先通过快速排序在进行下一步操作。)堆排序利用了这种数据结构,可以在线性时间内建堆,最好、平均和最坏性能都是O(nlog₂n)归并排序由于其子序列和初始序列排列无关,所以其最好、平均和最坏性能都是O(nlog₂n)

2.空间复杂度

        直接插入排序冒泡排序简单选择排序希尔排序堆排序都仅需要借助常数个辅助空间。快速排序是通过递归实现,所以要借助递归栈实现递归,平均情况下是O(log₂n),最坏可以增长到O(n)。2路归并排序每趟归并都需要开辟一片新的空间来暂时存放排序过的序列,大小为O(n),也是内部排序中空间复杂度数量级最高的。

3.稳定性

        直接插入排序、冒泡排序、二路归并排序、基数排序都是稳定的排序方法,而简单选择排序、希尔排序、快速排序、堆排序是不稳定的排序方法。平均时间复杂度为O(nlog₂n)且稳定的排序算法只有归并排序,可以跟快速排序堆排序区分开来。

       

二、排序趟数是否与序列的原始状态有关

        有关:冒泡排序、快速排序

        无关:直接插入排序、希尔排序、简单选择排序、堆排序、归并排序、基数排序

        只有冒泡排序快速排序的排序趟数是跟序列的原始状态有关的。首先要理解什么是排序趟数:排序趟数按照我的理解就是排序算法实现总共需要几个大循环,一趟也就是序列进行了一次排序。(可能解释的不太好懂,但是大家肯定也能懂其含义,欢迎大家补充指正。)

        冒泡排序和快速排序同属于交换排序,两者的排序算法主要思想都是相同的。所谓交换,就是根据序列中两个元素关键字的比较结果来确定这两个记录在序列中的位置。冒泡排序如果初始序列已基本有序,在某趟后序列已有序,就不需要继续排序了,可以直接排好,所以跟初始序列有关。对快速排序,基本有序的序列会大大提高快排的时间复杂度,也会增加排列趟数 ,而无序的排列会相对减少趟数。(可是王道书上是无关,其解释是:对于快速排序,每个元素都确定它的最终位置都需要一趟排序,无论序列状态如何,都需要n趟排序,只不过都于不同的初始状态,每趟处理的时间效率不同,初始效率越接近有序,效率反而越低。我的理解是可能王道上的理解的趟数是每确定一个元素最终位置都是一趟,及执行一次QuickSort()就算一趟,大家有什么见解欢迎在评论留言,一起探讨)     

        其它排序算法排序趟数都是跟初始序列状态无关的。直接插入排序每趟排序都是插入一个元素,无论其原始序列是怎样的,总共需要n-1趟 。希尔排序同样无论原始序列怎样,趟数只跟元素个数和设置的“增量”大小有关。堆排序每趟排序都确定一个根结点的位置,所以总共需要n-1趟。归并排序排序趟数跟元素个数一次归并序列的个数有关,归并排序本来就类似于逆向的树,以二路归并排序树为例,二路归并排序就类似于倒着的二叉树,排列趟数就是树高,趟数为log₂n基数排序每趟排序都要进行“分配”和“收集”,排序趟数固定为d,及子关键字的位数个数

三、比较次数是否与序列的原始状态有关

有关:直接插入排序、希尔排序、冒泡排序、快速排序、堆排序

无关:简单选择排序、二路归并排序、基数排序

直接插入排序插入时的比较次数是跟初始序列有关的,举个例子

 顺序时,比较次数是n-1,而逆序时,比较次数就增长到n(n-1)/2,数量级由O(n)变到O()。 

希尔排序本身就是直接插入的优化,每趟希尔排序就是直接插入,若本来就正序,就会相比逆序少比较。本来正序比较次数是O(n)数量级,而逆序转正序需要的比较次数是O()数量级。

冒泡排序中如果某一趟排序过程中未发生交换,则算法可以提前结束,这样交换次数也会少很多。

快速排序无序相对于有序比较次数会少很多

堆排序中每趟确定一个根结点的位置,会从将元素前最后一个元素“上浮”到根结点,不同序列导致这个元素可能“下沉”到不同的层次,导致比较次数就不会有所不同。

简单选择排序二路归并排序基排序的比较次数是与序列原始状态无关的。

简单选择排序,每确定一个元素的位置都需要经过这个位置之后的元素挨着比较,无论序列是否有序,次数始终是n(n-1)/2。

二路归并排序任何一次的二路归并排序元素的比较次数都约为n-1。

基数排列本来就不基于比较和移动进行排序。

四、一趟是否能确定一个元素最终位置

        冒泡排序、简单选择排序、快速排序、堆排序每一趟都可以确定一个元素的最终位置。而其他排序算法都不可以。

冒泡排序每趟排序都可以将序列中最大(或最小)的元素放到待序列的第一个位置或最后一个位置。

简单选择排序每趟排序都从待排序序列中找出最大或最小的元素交换到某个特定位置。

快速排序每趟排序都可以确定该趟枢轴的最终位置。

堆排序每趟排序都可以将堆的根结点对应元素交换到有序序列部分。

直接插入排序每趟排序只是能确定元素相对于有序序列的相对位置,不能确定其最终位置。

希尔排序直到最后一趟排序才可以将每个元素的最终位置确定。

二路归并排序每趟排序只是确定每个需要归并元素的相对位置,不能确定元素的最终位置。

基数排序每趟根据其子关键字的序列通过链表连接再分解到序列中,直到最后一趟排序才能确定元素的最终位置。

        

总结

以上就是我本次想要分享的关于八大排序算法的性质和特性的总结,可能会有很多错误,敬请大家指正。

  • 16
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值