内部排序算法的特点

目录

1.内部排序算法的时间/空间复杂度

2.内部排序算法的稳定性

3.内部排序算法的排序趟数

4.内部排序算法总比较次数

5.内部排序算法能否并行执行

6.内部排序算法顺序存储更换为链式存储

7.各内部排序算法的特点


本篇从多角度比较各个内部排序算法的特点,有助于全方位理解各个排序算法,如果下列哪个特点没有特别清晰,那么赶紧查缺补漏,如果对某个特点有异议,请在评论区指出,感谢佬们!💖💖💖

如果对某些概念模糊,也可以看看这两篇:

排序算法(1)

排序算法(2)

1.内部排序算法的时间/空间复杂度

2.内部排序算法的稳定性

直接插入排序:稳定
折半插入排序:稳定
希尔排序:不稳定
冒泡排序:稳定
快速排序算法:不稳定

简单选择排序:不稳定

堆排序:不稳定

归并排序:稳定

基数排序:稳定

总结:4个“不稳定”:简单选择排序,快速排序,希尔排序,堆排序

3.内部排序算法的排序趟数

针对n个元素的序列:

直接插入排序:每趟都插入一个元素,排序趟数固定为n-1,和序列初始状态无关。
折半插入排序:趟数固定为n-1。
希尔排序:希尔排序的趟数取决于所选的d(增量序列)。不同的增量序列会导致不同的排序趟数。
冒泡排序:冒泡排序的趟数是1~n-1,和初始序列有关。
快速排序算法:排序的趟数为log2n~n-1,具体取决于序列的原始状态(还取决于划分方法,例如枢轴元素的位置)

简单选择排序:简单选择排序每趟都选出一个最小(或最大)的元素,排序的趟数固定为n-1。与序列的原始状态无关。

堆排序:固定n-1趟排序(总共n-1趟的交换和建堆)。

归并排序:归并的趟数固定为趟。

基数排序:每趟都要进行分配和收集,排序趟数固定为d,和序列初始状态无关。

4.内部排序算法总比较次数

直接插入排序:比较次数与初始序列有关。
折半插入排序:折半插入排序每趟的比较次数都为O(log2m)(m为当前已排序好的子序列的长度),因此总比较次数的确定的。
希尔排序:希尔排序的比较次数也取决于增量序列。
冒泡排序:比较次数与初始序列有关。
快速排序算法:比较次数与初始序列有关。

简单选择排序:总比较次数固定,并且为\frac{n(n-1)}{2}。但是移动次数与序列的初始排列有关,最好情况是不移动,最坏情况是n-1次移动。

堆排序:比较次数与初始序列有关(例如某元素只有左孩子,只用和左孩子比较(比较1次),若某元素有左,右两个孩子,则比较次数为2。即左,右孩子先比较,再与父结点比较)。

归并排序:和序列初始状态有关,比较次数不确定。

基数排序:不是基于比较的排序算法。

5.内部排序算法能否并行执行

直接插入排序:需要基于上次排序好的序列继续排序,不能并行执行。
折半插入排序:折半插入排序需要在已排序好的部分找到正确的插入位置,不能并行执行。
希尔排序:无法并行执行,需要基于上一次已经排序好的序列排序。
冒泡排序:每趟对未排序的元素进行一趟处理,无法并行执行。
快速排序算法:快速选择排序每趟划分子序列互不影响,可以并行执行。

简单选择排序:不可以并行执行,因为需要在上一个排序序列的基础上找到次大(次小)的元素。

堆排序:可以并行执行,因为根结点的左右子树构成的子堆在执行过程中互不影响。

归并排序:各个归并段可以并行执行。

基数排序: 基数排序每趟需要利用前一趟已排序好的序列,无法并行执行。

6.内部排序算法顺序存储更换为链式存储

直接插入排序:换为链式存储时间复杂度仍为O(n)。
折半插入排序:利用顺序存储随机访问的特性,不能使用链式存储。
希尔排序:利用顺序存储随机访问的特性,不能使用链式存储。
冒泡排序:可以使用链式存储,时间复杂度仍为O(n)。
快速排序算法:一般不使用链式存储。

简单选择排序:可以更换为链表存储。时间复杂度仍然为O(n^2)

堆排序:利用顺序存储随机访问的特性,不能使用链式存储。

归并排序:可以使用链表存储,在合并两个有序子链表时,创建一个新的链表来保存合并后的结果即可。

基数排序:就是用链式存储结构实现的。

7.各内部排序算法的特点

直接插入排序:进行一次比较后,前2个元素有序。适用于基本有序的序列,并且适合于元素较少的序列。
折半插入排序:一次折半插入排序,前2个元素有序;两次折半插入排序,3个元素有序..
希尔排序:每次对划分的子表进行排序,得到局部有序的结果,所以不能保证每趟排序结束都能确定一个元素的最终位置。
冒泡排序:进行一趟排序算法后,会有一个元素在其最终位置。要么在开头,要么在结尾。
快速排序算法:

对n个元素进行第一趟快速排序后,会确定一个基准元素,根据这个基准元素在数组中的位置,有两种情况:①基准元素在数组的首端或尾端,接下来对剩下的 n-1 个元素构成的子序列进行第二趟快速排序,再确定一个基准元素。这样,在两趟排序后就至少能确定两个元素的最终位置,其中至少有一个元素是在数组的首端或尾端。②基准元素不在数组的首端或尾端,第二趟快快速排序对基准元素划分开的两个子序列分别进行一次划分,两个子序列各确定一个基准元素。这样,两趟排序后就至少能确定三个元素的最终位置

快速排序算法适用于无序的序列,并且适合于元素较多的序列。

简单选择排序:每次选择未排序序列中最小的元素放入其最终位置。

堆排序:若想得到递增的序列,每次都将大根堆的根结点但与表尾结点交换,确定其最终位置。

归并排序(二路归并排序):进行一趟归并排序后,每2个元素有序,进行两趟归并排序后,每4个元素有序。

基数排序:按照各个 关键字位 权重递增的次序,对 d 个关键字位分别做“分配”和“收集。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值