排序算法总结

数据结构的内部排序

基本概念

这里写图片描述

数据结构中的内部各种排序,大体上分为五大类:
★插入类排序
★交换类排序;
★选择类排序;
★归并排序;
★分配类排序;

插入类排序

基本思想:
在一个已经排好序的序列中,每一步都将下一个待排序的记录插入到已排好序的记录中,直到所有待排序的记录全部插入为止。

插入类排序又分为三大类:
●直接插入排序;
●折半插入排序;
●希尔排序;
下面我们以直接插入排序与希尔排序为例。
(1) 直接插入排序
算法思想:将第i个记录(i一般是从2开始)插入到前面i-1个已经排好序的记录中。 具体过程:将第i个记录的关键字K顺次与其前面记录的关键字进行比较。将所有关键字大于K的记录依次向后移动一个位置,直到遇到小于或等于K的关键字,就把K插入到其后面即可。
这里写图片描述
直接插入排序举例

以12 2 16 30 8 28 4 10 20 6 18序列为例
第一趟:2 12 16 30 8 28 4 10 20 6 18
第二趟:2 8 12 16 30 28 4 10 20 6 18
第三趟:2 8 12 16 28 30 4 10 20 6 18
第四趟:2 4 8 12 16 28 30 10 20 6 18
第五趟:2 4 8 10 12 16 28 30 20 6 18
第六趟:2 4 8 10 12 16 20 28 30 6 18
第七趟:2 4 6 8 10 12 16 20 28 30 18

直接插入排序是稳定的。算法时间复杂度O(n2)

希尔排序

算法思想:将待排序记录序列分割成若干个较稀疏的子序**列,分别进行直接插入排序。
具体过程:
①首先选定记录间的距离d,将待排序的记录序列中所有间隔为d的记录分为一组,进行组内直接插入排序。
②继续选定记录间的距离d1(d1< d),将待排序的记录序列中所有间隔为d1的记录分为一组,进行组内直接插入排序。
③重复步骤②,直到记录间的距离为1,完成整个排序过程。
这里写图片描述
这里写图片描述
希尔排序不是稳定的。

插入排序总结:
这里写图片描述

交换类排序

算法思想:通过交换逆序元素进行排序的方法。
交换类排序又分为两大类:

●冒泡排序;
●快速排序;

冒泡排序

思想:
反复扫描待排序序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟,从第一个数据开始,比较相邻的两个数据,(以升序为例)如果大就交换,得到一个最大数据在末尾;然后进行第二趟,只扫描前n-1个元素,得到次大的放在倒数第二位。以此类推,最后得到升序序列。如果在扫描过程中,发现没有交换,说明已经排好序列,直接终止扫描。所以最多进行n-1趟扫描。
这里写图片描述

快速排序

思想:
冒泡排序一次只能消除一个逆序,为了能一次消除多个逆序,采用快速排序。以一个关键字为轴,从左从右依次与其进行对比,然后交换,第一趟结束后,可以把序列分为两个子序列,然后再分段进行快速排序,达到高效。
这里写图片描述

交换排序总结:

  • 冒泡排序:
    时间复杂度:T(n) = O(n²)。
    稳定性:稳定排序。
  • 快速排序
    时间复杂度:平均T(n) = O(n㏒n),最坏O(n²)。
    稳定性:不稳定排序。

选择类排序

思想:每一趟在n – i + 1 ( i = 1,2, … , n - 1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。
分类:

  • 简单选择排序:

① 思想:第一趟时,从第一个记录开始,通过n – 1次关键字的比较,从n个记录中选出关键字最小的记录,并和第一个记录进行交换。第二趟从第二个记录开始,选择最小的和第二个记录交换。以此类推,直至全部排序完毕。

② 时间复杂度:T(n) = O(n²)。

③ 空间复杂度:S(n) = O(1)。

④ 稳定性:不稳定排序。

  • 树形选择排序:

① 思想:为了减少比较次数,两两进行比较,得出的较小的值再两两比较,直至得出最小的输出,然后在原来位置上置为∞,再进行比较。直至所有都输出。

② 时间复杂度:T(n) = O(n㏒n)。

③ 空间复杂度:较简单选择排序,增加了n-1个额外的存储空间存放中间比较结果,就是树形结构的所有根节点。S(n) = O(n)。

④ 稳定性:稳定排序。

  • 堆排序:

① 思想:把待排序记录的关键字存放在数组r[1…n]中,将r看成是一刻完全二叉树的顺序表示,每个节点表示一个记录,第一个记录r[1]作为二叉树的根,一下个记录r[2…n]依次逐层从左到右顺序排列,任意节点r[i]的左孩子是r[2i],右孩子是r[2i+1],双亲是r[i/2向下取整]。然后对这棵完全二叉树进行调整建堆。

② 时间复杂度:T(n) = O(n㏒n)。

③ 空间复杂度:S(n) = O(1)。

④ 稳定性:不稳定排序

归并排序

这里写图片描述
这里写图片描述
这里写图片描述

② 时间复杂度:T(n) = O(n㏒n)。

③ 空间复杂度:S(n) = O(n)。

④ 稳定性:稳定排序。

总结

(1)简单排序法一般只用于n较小的情况(例如n<30)。当序列的记录“基本有序”时 ,直接插入排序是最佳的排序方法。如果记录中的数据较多,则应采用移动次数较少的简单选择排序法。

(2)快速排序、堆排序和归并排序的平均时间复杂度均为O(n㏒n),但实验结果表明,就平均时间性能而言,快速排序是所有排序方法中最好的。 遗憾的是,快速排序在最坏情况下的时间性能为O(n²)。堆排序和归并排序的最坏时间复杂度仍为O(n㏒n),当n较大时,归并排序的时间性能优于堆排序,但它所需的辅助空间最多。

(3)可以将简单排序法与性能较好的排序方法结合使用。例如,在快速排序中,当划分子区间的长度小于某值时,可以转而调用直接插入排序法;或者先将待排序序列划分成若干子序列,分别进行直接插入排序,然后再利用归并排序法,将有序子序列合并成一个完整的有序序列。

(4)基数排序的时间复杂度可以写成O(d·n)。因此,它最适合于n值很大而关键字的位数d较小的序列。当d远小于n时,其时间复杂度接近O(n)。

(5)从排序的稳定性上来看,在所有简单排序法中,简单选择排序是不稳定的,其他各种简单排序法都是稳定的。然而,在那些时间性能较好的排序方法中,希尔排序、快速排序、堆排序都是不稳定的,只有归并排序、基数排序是稳定的。

文章参考:http://blog.csdn.net/wzyhb123456789/article/details/5974790

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值