数据结构基础:P10.4-排序(二)--->排序算法的比较

本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,前面的系列文章链接如下
数据结构基础:P1-基本概念
数据结构基础:P2.1-线性结构—>线性表
数据结构基础:P2.2-线性结构—>堆栈
数据结构基础:P2.3-线性结构—>队列
数据结构基础:P2.4-线性结构—>应用实例:多项式加法运算
数据结构基础:P2.5-线性结构—>应用实例:多项式乘法与加法运算-C实现
数据结构基础:P3.1-树(一)—>树与树的表示
数据结构基础:P3.2-树(一)—>二叉树及存储结构
数据结构基础:P3.3-树(一)—>二叉树的遍历
数据结构基础:P3.4-树(一)—>小白专场:树的同构-C语言实现
数据结构基础:P4.1-树(二)—>二叉搜索树
数据结构基础:P4.2-树(二)—>二叉平衡树
数据结构基础:P4.3-树(二)—>小白专场:是否同一棵二叉搜索树-C实现
数据结构基础:P4.4-树(二)—>线性结构之习题选讲:逆转链表
数据结构基础:P5.1-树(三)—>堆
数据结构基础:P5.2-树(三)—>哈夫曼树与哈夫曼编码
数据结构基础:P5.3-树(三)—>集合及运算
数据结构基础:P5.4-树(三)—>入门专场:堆中的路径
数据结构基础:P5.5-树(三)—>入门专场:File Transfer
数据结构基础:P6.1-图(一)—>什么是图
数据结构基础:P6.2-图(一)—>图的遍历
数据结构基础:P6.3-图(一)—>应用实例:拯救007
数据结构基础:P6.4-图(一)—>应用实例:六度空间
数据结构基础:P6.5-图(一)—>小白专场:如何建立图-C语言实现
数据结构基础:P7.1-图(二)—>树之习题选讲:Tree Traversals Again
数据结构基础:P7.2-图(二)—>树之习题选讲:Complete Binary Search Tree
数据结构基础:P7.3-图(二)—>树之习题选讲:Huffman Codes
数据结构基础:P7.4-图(二)—>最短路径问题
数据结构基础:P7.5-图(二)—>哈利·波特的考试
数据结构基础:P8.1-图(三)—>最小生成树问题
数据结构基础:P8.2-图(三)—>拓扑排序
数据结构基础:P8.3-图(三)—>图之习题选讲-旅游规划
数据结构基础:P9.1-排序(一)—>简单排序(冒泡、插入)
数据结构基础:P9.2-排序(一)—>希尔排序
数据结构基础:P9.3-排序(一)—>堆排序
数据结构基础:P9.4-排序(一)—>归并排序
数据结构基础:P10.1-排序(二)—>快速排序
数据结构基础:P10.2-排序(二)—>表排序
数据结构基础:P10.3-排序(二)—>基数排序

文章目录

  • 一、排序算法的比较
  • 小测验


一、排序算法的比较

前面我们说过了,没有任何一种排序算法是任何情况下都最好的。所以最后就给大家比较一下各排序算法它们的优缺点,如下表所示:
数据结构基础:P10.4-排序(二)--->排序算法的比较_第1张图片

从表中可以看出

①前面三种排序我们统称简单排序,都是最直截了当最简单的排序方法。我们可以看到他们的时间复杂度都是比较差的,但是他们共同的优点都是:程序非常好写,写起来非常短,都不需要额外的空间。
------冒泡排序和直接插入排序每次都交换的是两个相邻的元素,所以很慢。但是好处是不需要交换的时候他就不交换,那么他们这两种算法都是稳定的。
------简单选择排序是跳着交换的,导致的结果就是这个算法有可能是不稳定的。
②后面五种排序的复杂度都比简单排序低
------希尔排序是最先打破 N 2 \rm{N^2} N2复杂度的,他的复杂度是 N d N^d Nd。这个d实际上取决于增量序列的选择,如果增量序列选择得当,这个d会是小于2的。最坏情况下这个d就是就等于2,所以最坏情况下这也就是 N 2 \rm{N^2} N2的。因为它是跳着排的 ,所以他也是不稳定的。
------堆排序和归并排序这两个排序从理论上讲他们的时间复杂度都是最好的,就是 N l o g N \rm{NlogN} NlogN,无论什么情况都是 N l o g N \rm{NlogN} NlogN。归并排序的缺点是需要一个额外的空间,当你要排序的数据量非常大的时候,会导致你只能排一半的数据。堆排序理论上看着很好,但是虽然它是 O ( N l o g N ) \rm{O(NlogN)} O(NlogN),但是 O \rm{O} O这个常数会比较大。堆排序是不稳定的,归并排序是稳定的。
------对于快速排序,起你总可以构造一种最坏的情况,使得他的时间复杂度是 N 2 \rm{N^2} N2这个数量级的。而且因为他是递归的,在时间复杂度最好的情况下他的空间复杂度也需要 O ( l o g N ) \rm{O(logN)} O(logN)。但是快速排序的平均时间复杂度是很好的 O ( N l o g N ) \rm{O(NlogN)} O(NlogN),而且关键是这个前面的常数比较小。所以在实际应用中,快速排序是非常快的。
------基数排序在某种情况下会打破 N l o g N \rm{NlogN} NlogN这个魔咒,会快到近乎线性。当然这就取决于你到底需要多少个桶、需要多少趟的分配和收集。他的额外空间复杂度要看情况,看采用主位优先还是次位优先。如果你实现正确的话,基数排序也是稳定的。


小测验

1、请选择下面四种排序算法中最快又是稳定的排序算法:

A. 希尔排序
B. 堆排序
C. 归并排序
D. 快速排序

答案:C

2、下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上

A. 堆排序
B. 插入排序
C. 冒泡排序
D. 快速排序

答案:B

3、当待排序列已经基本有序时,下面哪个排序算法效率最差

A. 快速排序
B. 直接插入
C. 选择排序
D. 堆排序

答案:C

4、数据序列(3,2,4,9,8,11,6,20)只能是下列哪种排序算法的两趟排序结果

A. 冒泡排序
B. 插入排序
C. 选择排序
D. 快速排序

答案:D

你可能感兴趣的:(数据结构基础,数据结构,排序算法,算法,c语言,c算法)