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

文章目录

  • 前言
  • 总结图
  • 一、排序算法的时空复杂度、稳定性
    • 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。

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

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

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

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

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

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

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

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

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

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

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

总结

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

八大排序算法的性质及特性比较相关推荐

  1. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  2. 超详细的八大排序算法的各项比较以及各自的特点

    一.八大排序算法的总体比较 二.算法各自的特点(具体实现见后面博客) 1.快排 (1)算法思想 选择一个基准元素,将比基准元素小的元素放在其前面,比基准元素大的元素放在其后面,然后在将小于基准值元素的 ...

  3. python 排序算法 简书_Python---简析八大排序算法

    前言 1 .排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过 ...

  4. 图解八大排序算法——我见过的最详细的讲解(转)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  5. 八大排序算法的java实现

    八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...

  6. 八大排序算法图文讲解

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...

  7. C语言八大排序算法,附动图和详细代码解释!

    文章来源:电子工程专辑.C语言与程序设计.竹雨听闲 一.前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二. ...

  8. 硬核!C语言八大排序算法,附动图和详细代码解释!

    来源 :C语言与程序设计.竹雨听闲等 一 前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二 八大排序算法 ...

  9. 用python排序算法_Python - 八大排序算法

    1.序言 本文使用Python实现了一些常用的排序方法.文章结构如下: 1.直接插入排序 2.希尔排序 3.冒泡排序 4.快速排序 5.简单选择排序 6.堆排序 7.归并排序 8.基数排序 上述所有的 ...

最新文章

  1. 关系管理系统:js代码生成select的出生日期
  2. Nagios系统监控软件的安装设置(4)
  3. js路由在php上面使用,director.js实现前端路由使用实例
  4. 画面测试时,图片显示时,0件与N件的意义!
  5. C语言程序设计(第三版)何钦铭著 习题2-6
  6. cadence PCB走等长线设置
  7. android 阅读器字体,为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块...
  8. 证券词汇集锦(中英文+注释版)
  9. VR MultiPass\SinglePass(Instanced)\MultiView 浅析和区分总结
  10. 字节跳动 —— 2023暑期实习面试
  11. 通过CCproxy配置内网linux服务器
  12. 云有约 | 首攻RSA,天空卫士“秀肌肉”怎么样了?
  13. 武汉同济医院挂号指南
  14. win10如何合并硬盘分区
  15. 【教程】Ubuntu20.04 + VirtualBox 各种软件环境安装
  16. Python plotly保存图片
  17. 安化云台山第二届星空帐篷音乐节盛大启动
  18. pdf转图片的两种方式(java)
  19. 快速批量压缩照片到指定大小工具,照片图片批量压缩实现方法,批量压缩工具
  20. P1247 取火柴游戏 (博弈论)

热门文章

  1. ROS修改:ubuntu系统更改默认python版本(重要操作)
  2. 【Android 2d 游戏开发(2)】——2048
  3. MFC 添加皮肤库方法步骤
  4. BIM模型文件下载——三层Revit商务办公楼模型
  5. 飞行堡垒吃鸡重装版预售 从此放肆“吃鸡”
  6. 从零搭建Hexo博客并部署阿里云服务器(奶妈级教学)
  7. 曾经和人谈到情,句句不离你
  8. 如何取视频第一帧作为封面图片上传
  9. Linux命令之wget命令
  10. 在matlab中dt什么意思,matlab中的 fixdt是什么意思