史上最全排序算法全面总结

考察点

在信息学奥赛初赛中对于排序算法的考察主要体现在以下几方面:
1、时间复杂度
2、稳定性
3、最坏情况下移动次数
4、移动次数与关键字顺序关系

先看熟记知识点

在这里插入图片描述
1.关于稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

不稳定:快选堆希(快速排序、选择排序、堆排序、希尔排序)

稳 定:插冒归计基(简单插入排序、冒泡排序、归并排序、计数排序、基数排序)

2.关于移动次数和关键字顺序无关的排序
顺口溜:一堆(堆排序)海龟(归并排序)选(选择排序)基(基数排序)友

再细品每个排序算法

第一类 交换排序
1、冒泡排序
基本思想:两两比较相邻记录的关键字,如果反序则交换

时间复杂度:最好的情况为O(n),最坏的情况是O(n2) ,平均复杂度O(n2)

稳定性:稳定

排序演示

2、快速排序
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度:最坏情况下O(n2)最好情况下O(nlogn),平均情况下O(nlogn)

稳定性:不稳定

排序演示

第二类 插入排序
1、简单插入排序
基本思想:将一个记录插入到已经排好序的有序表中, 从而得到一个新的,记录数增1的有序表

时间复杂度:最坏情况O(n2),最好情况O(n),平均情况O(n2); 比冒泡法和选择排序的性能要更好一些

稳定性:稳定

2、希尔排序
基本思想:可以理解成插入排序的优化版本。
(1)初始间隔N=数组长度/2
(2)对间隔为N的分组进行插入排序,直至有序
(3)缩小N值,N=N/2;
(4)重复2、3步骤,直至间隔N=1

时间复杂度:最坏情况O(n2),最好情况O(n),平均情况O(n3/2),要好于直接插入排序的O(n^2)

稳定性:不稳定

算法演示

第三类 选择排序
1、简单选择排序
基本思想:通过n-i次关键字之间的比较,从n-i+1 个记录中选择关键字最小的记录,并和第i(1<=i<=n)个记录交换之

时间复杂度:O(n2)

移动次数与关键字顺序无关

稳定性:不稳定

算法演示

2、堆排序
基本思想:将待排序的序列构造成一个大顶堆.此时,整个序列的最大值就是堆顶 的根结点.将它移走(其实就是将其与堆数组的末尾元素交换, 此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次大值.如此反复执行,便能得到一个有序序列了。

时间复杂度: O(nlogn),

移动次数与关键字顺序无关

稳定性:不稳定

算法演示

第四类 归并排序
1、归并排序
基本思想:假设初始序列含有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到(不小于n/2的最小整数)个长度为2或1的有序子序列,再两两归并,…如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

时间复杂度:O(nlogn),

移动次数与关键字顺序无关

稳定性:稳定

算法演示

上述7种都是比较排序,下面3种都是非比较排序,理论上可以达到O(n),比比较排序要快,但是这3种都是有其应用背景才能发挥作用的,否则适得其反。

第五类 非比较排序
1、计数排序
基本思想:计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。

算法的步骤如下:

(1)找出待排序的数组中最大和最小的元素
(2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项
(3)对所有的计数累加(从C中的位置为1的元素开始,每一项和前一项相加)
(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

时间复杂度:O(n+k)

稳定性:稳定

算法演示

2、桶排序
基本思想:将数组分到有限数量的桶子里。每个桶子再个别排序

时间复杂度:O(n+k)

稳定性:稳定

算法演示

3、基数排序
基本思想:将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

时间复杂度:O(n*k)

稳定性:稳定

算法演示

相应练习题目

在这里插入图片描述
1、若要对1000个元素排序,要求既快又稳定,则最好采用(B )方法。
A.直接插入排序
B.归并排序
C.堆排序
D.快速排序
2、若要从1000个元素中得到10个最小值元素,最好采用(C )方法。
A.直接插入排序
B.直接选择排序
C.堆排序
D.快速排序
3、若一个元素序列基本有序,则选用( A)方法较快。
A.直接插入排序
B.简单选择排序
C.堆排序
D.快速排序
4、在平均情况下速度最快的排序方法为(D )
A.直接选择排序
B.归并排序
C.堆排序
D.快速排序
5、以下需要辅助空间最少的排序方法为(A )
A.基数排序
B.归并排序
C.堆排序
D.快速排序
6、对待排序的元素序列进行划分,将其分为左、右两个子序列,再对两个子序列施加同样的排序操作,直到子序列为空或只剩一个元素为止。这样的排序方法是( C)。
A.直接选择排序
B.直接插入排序
C.快速排序
D.起泡排序

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信奥教练Andy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值