数据结构复习之归并排序与分配排序 总结

归并排序

思想:采用经典的分治(divide-and-conquer)策略,初始时将待排序序列R[1…n]看成是n个长度为1的有序序列,通过第一趟两两归并后,得到n/2 上取整个长度为2的有序序列,然后再两两归并,得到n/4 个上取整长度为4的有序序列,如此重复,直到得到一个长度为n的有序序列。若将两个有序表合并成一个有序表,称为二路归并

实例

序列(72,18,53,36,48,31,36)
在这里插入图片描述

算法分析

二路归并排序法需要进行log2n 上取整趟,其时间复杂度为O(nlog2n),空间复杂度为O(n)。是一种稳定的排序方法。

分配排序

排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序。常用的分配排序有箱排序和基数排序。

箱排序

置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1],把关键字等于k的记录全都装入到第k个箱子里(分配),然后按序号依次将各非空的箱子首尾连接起来(收集)。

算法分析

箱排序的时间复杂度为 O(n)。箱排序是稳定排序,箱排序只适用于关键字取值范围较小的情况,否则所需要箱子的数目太多,会导致存储空间的浪费和计算时间的增长。

基数排序

从低位到高位依次对Kj(j=d-1,d-2,…,0)进行箱排序。在d趟箱排序中,所需的箱子数就是基数rd,r是多少趟,这就是"基数排序"名称的由来。

实例

键字序列{278,109,063,930,589,184,505,269,008,083},写出基数排序(升序)的排序过程
在这里插入图片描述

算法分析

基数排序的时间复杂度是O(d*(rd+n))。其中rd是基数,d是关键字的位数,n是元素个数。基数排序所需的辅助存储空间为O(n+rd)。基数排序是稳定的。

内排序比较

相关算法总结:核心的排序算法
简单的排序算法以备查验

八大排序算法的实现过程,简单整理

插入排序2个

直接插入排序

前提是将待排序数组分成两部分,r[1],有序区,r[2…n]无序区,
分为三步:一是找到待排序元素应该插入的位置,先与有序区的最后一个元素比较,直到找到不小于的位置或等于哨兵位置为止;二是移动后面的元素,为待排序元素插入腾出空间;最后是插入待排序元素。

希尔排序

直接插入排序的基础上发展而来,只不过每次排序的元素都间隔一定的距离,而且最后一趟就是直接插入排序。

交换排序2个

冒泡排序

相邻两个元素比较,后面数比前面数大的话就将大的移到后面,然后再比较刚移到后面的大的数是否比下一个元素还要大,依次比较,每一趟找出的最大的值后,将比较长度减1

快速排序

一般选第一个元素作为基准值进行划分,划分的目标是划分成比基准值小的区和一个比基准值大的区。首先从右往左找第一个比基准值小的值,并交换到基准值的位置;然后从左往右找第一个比基准值大的元素,并交换到上一个比基准值小的元素的位置,就这样左右交替交换,直到前后两个指针相遇,此时一趟划分过程结束,也找到了基准值在整个序列中的位置。
再在两个划分好的区中,分别选一个基准值,两个基准值分别用以上的方法,再划分,找到基准值所在的位置。

选择排序2个

直接选择排序

每次选出数组中的最小值,并与有序区中的第一个记录r[1]交换位置,然后在剩下元素中,再选出第二小值与r[2]交换,依次进行。r[0]位置还是作为哨兵。

堆排序

首先我们要把整个序列的所有非叶子节点进行调整为大根堆或者小根堆,调整完以后根节点要么是值最大的节点(大根堆),要么是值最小的节点(小根堆),然后将根节点和最后一个节点进行交换,交换完以后就相当于排好了一个元素。此时整棵树中除了根节点以外,其他非叶子结点都是大根堆,所以这个时候只需要将根节点调整为大根堆即可,而且需要注意的一点是之前交换过的根节点不再参与后面的调整。
知道根结点的序号m,孩子结点是2m和2m+1(序号从1开始算)
知道孩子结点序号m,双亲结点的序号是m/2下取整

归并排序 1个

将序列看成是长度为1有序序列,两两归并,再看成长度为2…

分配排序 2个

桶排序或箱排序

按记录值k放到第k个箱子中,然后将非空的箱子连接起来

基数排序

对于一个数而言,先排权值比较小的位数,如三位数字序列{195,683, 756},先按个位排序,则为{683,195,756};再按十位排序,则为{756, 683,195};最后按百位进行排序,则为{195, 683, 756}。

时间复杂度

(1)直接插入、直接选择、冒泡排序算法的时间复杂度为O(n2)
(2)快速、归并、堆排序算法的时间复杂度为O(nlog2n)。
(3)希尔排序算法的时间复杂度很难计算,有几种较接近的答案:O(nlog2n)或O(n1.25)。
(4)基数排序算法的时间复杂度为O(d*(rd+n)),其中rd是基数,d是关键字的位数,n是元素个数。

稳定性

(1)直接插入、冒泡、归并和基数排序算法是稳定的;
(2)直接选择、希尔、快速和堆排序算法是不稳定的。

空间复杂度

(1)直接插入、直接选择、冒泡、希尔和堆排序算法需要辅助空间为O
(2)快速排序算法需要辅助空间为O(log2n);
(3)归并排序算法需要辅助空间为O(n)
(4)基数排序算法需要辅助空间为O(n+rd)

总结

在这里插入图片描述

选择排序考虑因素

(1)待排序的记录个数。
(2)记录本身的大小和存储结构。
(3)关键字的分布情况。
(4)对排序稳定性的要求。
(5)时间和空间复杂度等。

选取原则

(1)若待排序的一组记录数目较小(如n≤50)时,可采用插入排序或选择排序。
(2)若n较大时,则应采用快速排序、堆排序或归并排序。
(3)若待排序记录按关键字基本有序时,则适宜选用直接插入排序或冒泡排序。
(4)当n很大,而且关键字位数较少时,采用链式基数排序较好。
(5)关键字比较次数与记录的初始排列顺序无关的排序方法是选择排序。

排序对存储方式要求

一般的排序方法都可以在顺序结构(一维数组)上实现。当记录本身信息量较大时,为了避免移动记录耗费大量的时间,可以采用链式存储结构。例如插入排序、归并排序、基数排序易于在链表上实现,使之减少记录的移动次数,但有的排序方法,如快速排序、堆排序在链表上却难于实现,在这种请况下,可以提取关键字建立索引表,然后对索引表进行排序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值