【08】排序 深度分析几种排序特性

1.直接插入排序

算法思路: 每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当的位置上,直到所有待排的关键字都被插入到有序序列中为止。
代码模板
for (从第二个数据开始对所有数据循环处理)
{
if (第i个数据小于它之前的第i-1个数据)
{
➀ 将第i个数据复制到一个空闲空间临时存储,这个空间为“哨兵”
➁ 在前i-1个数据中寻找合适的位置,将从该位置开始的元素全部后移
➂ 将哨兵数据插入到合适位置
}
}
示例
在这里插入图片描述
算法性能
时间复杂度为:O(n^2)
空间效率:仅占用1个缓冲单元—— O(1)
算法的稳定性:稳定

2.希尔排序

      在直接插入排序中,如果原始记录序列是基本有序的,或者待排序的记录个数比较少,排序的效率会大大提高。
基于此,提出了希尔排序。
算法思路:
      每次把一个长序列分割为K个短序列进行高效的直接插入排序,形成一种“基本有序”的顺序;再调用直接插入排序算法,对全体记录进行一个高效的排序。
      把整个待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次缩小,当完成了所有数据元素都在一个组内的排序后排序过程结束。
技巧:小组的构成不是简单地“逐段分割”,而是将相隔某个增量d的记录组成一个小组,让增量d逐趟缩短(例如依次取5,3,1),直到d=1为止。

算法示意:
在这里插入图片描述
算法性能
(1)时间效率:O(nlog 2n)
(2)空间效率:O(1)——因为仅占用1个缓冲单元
(3)算法的稳定性:不稳定

3.冒泡排序

算法思想
每次不断将记录两两比较,并按“前小后大”(或“前大后小”)规则交换。

示例:
在这里插入图片描述
算法性能
(1)时间效率:O(n^2)
(2)空间效率:O(1)——只在交换时用到一个缓冲单元
(3)算法的稳定性:稳定

4.快速排序

算法思想:
将待排序序列分成两部分,其中一部分的记录都比另一部分的记录小,随后分别对这两部分再分成两部分,使一部分的记录都小于另一部分,如此反复最终使整个序列最终有序。
首先从待排序记录中任选取一个记录作为枢轴,又叫基准值(比如,第一个记录)。
通过一趟排序将待排序记录分割成独立的两部分,前一部分记录的关键字均小于以等于基准值,后一部分记录的关键字均大于或等于基准值,然后分别对这两部分重复上述操作,直到整个序列有序为止。
示例:
在这里插入图片描述
算法性能
(1)时间效率:O(nlog2n) —因为每趟确定的元素呈指数增加
(2)空间效率: O(log2n) —因为递归要用栈(存每层low,high和pivot)
(3)算法的稳定性:不稳定——因为有跳跃式交换。

5.选择排序

算法思路:
从头至尾扫描序列,找出最小的一个关键字,和第一个关键字交换;
接着从剩下的关键字中继续这种选择和交换,最终使序列有序。
示例:
在这里插入图片描述
算法性能
(1)时间效率: O(n^2)——虽移动次数较少,但比较次数仍多。
(2)空间效率: O(1) ——没有附加单元(仅用到1个temp)
(3)算法的稳定性:不稳定

6.堆排序

堆: 一棵完全二叉树,任一个非叶子结点的值都不大于 (或不小于)其左、右孩子结点的值。
小根堆:父亲小孩子大 小项堆、最小堆
大根堆:父亲大孩子小 大项堆、最大堆
算法思想
每次将堆的堆顶记录(根结点)输出;同时调整剩余的记录,使他们重新排成一个堆。重复以上过程,就能最终得到一个有序的序列。

堆排序的过程
第一步 建堆,将无序序列建成一个堆;
第二步 排序,选出堆中所有记录中的最小者(或最大者)
然后将它从堆中移走,并将剩余的记录再调整成堆,这样又找出了次小(或次大)的记录,依此类推,直到堆中只有一个记录为止,每个记录出堆的顺序就是一个有序序列。
算法性能
(1)时间效率: O(nlog2^n)。因为整个排序过程中需要调用n-1次堆顶点的调整,而每次堆排序算法本身耗时为nlog2;
(2)空间效率:O(1)。仅在第二个for循环中交换记录时用到一个临时变量temp。
(3)稳定性: 不稳定。
优点:对小文件效果不明显,但对大文件有效。

7.归并排序

算法思路
1.归并排序的基本思想:将两个(或以上)的有序表组成新的有序表。(归并排序主要是二路归并排序)
2.二路归并排序:可以把一个长度为n 的无序序列看成是 n 个长度为 1 的有序子序列 ,首先做两两归并,得到 n / 2 个长度为 2 的有序子序列 ;再做两两归并,…,如此重复,直到最后得到一个长度为 n 的有序序列。

示例:
在这里插入图片描述
算法性能
(1)时间效率: O(nlog2)
(2)空间效率:O(n) 需要转存整个待排序序列
(3)稳定性: 稳定

几种排序算法比较和个人看法:
在这里插入图片描述
在一些对稳定性要求比较高的环境中使用归并和基数法是较为快速的方法;
在一些对稳定性要求不是这么高,对响应速度有要求的环境下可以尝试希尔排序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值