408——数据结构 第七章 排序

在这里插入图片描述
在这里插入图片描述

1. 排序的基本概念

排序(Sort),就是重新排列表中的元素,使表中的元素满⾜按关键字有序的过程。

排序算法的评价指标:
1)算法的稳定性。若待排序表中有两个元素Ri和Rj,其对应的关键字相同即keyi = keyj,且在排序前Ri在Rj的前⾯,若使⽤某⼀排序算法排序后,Ri仍然在Rj的前⾯,则称这个排序算法是稳定的,否则称排序算法是不稳定的。
2)算法的时间复杂度空间复杂度

排序算法的分类:
内部排序: 数据都在内存中,如何使算法时间、空间复杂度更低。
外部排序: 数据太多,无法全部放入内存。还要关注如何使读/写磁盘次数更少。

2. 插入排序

2.1 直接插入排序

算法思想: 每次将⼀个待排序的记录按其关键字⼤⼩插⼊到前⾯已排好序的⼦序列中,直到全部记录插⼊完成。
在这里插入图片描述
在这里插入图片描述

空间复杂度:O(1)
最好时间复杂度(全部有序):O(n)
最坏时间复杂度(全部逆序):O(n2)
平均时间复杂度:O(n2)
算法稳定性:稳定

2.2 折半插入排序

当 low>high 时折半查找停⽌,应将 [low, i-1] 内的元素全部右移,并将 A[0] 复制到 low 所指位置。
当 A[mid]==A[0] 时,为了保证算法的“稳定性”,应继续在 mid 所指位置右边寻找插⼊位置。
移动元素的次数变少了,但是关键字对⽐的次数依然是O(n2) 数量级,整体来看时间复杂度依然是O(n2)
在这里插入图片描述
在这里插入图片描述

3. 希尔排序(Shell Sort)

希尔排序:先将待排序表分割成若⼲形如 L[i, i + d, i + 2d,…, i + kd] 的“特殊”⼦表,对各个⼦表分别进⾏直接插⼊排序。缩⼩增量d,重复上述过程,直到d=1为⽌。

在这里插入图片描述

时间复杂度:和增量序列 d1, d2, d3… 的选择有关,⽬前⽆法⽤数学⼿段证明确切的时间复杂度
最坏时间复杂度为 O(n2,当n在某个范围内时,可达O(n1.3)
稳定性:不稳定!
适⽤性:仅适⽤于顺序表,不适⽤于链表
在这里插入图片描述

4. 快速排序

算法思想:在待排序表L[1…n]中任取⼀个元素pivot作为枢轴(或基准,通常取⾸元素),通过⼀趟排序将待排序表划分为独⽴的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中的所有元素⼩于pivot,L[k+1…n]中的所有元素⼤于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为⼀次“划分”。然后分别递归地对两个⼦表重复上述过程,直⾄每部分内只有⼀个元素或空为⽌,即所有元素放在了其最终位置上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 冒泡排序

从后往前(或从前往后)两两⽐较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列⽐较完。称这样过程为“⼀趟”冒泡排序。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 选择排序

6.1 简单选择排序

选择排序:每⼀趟在待排序元素中选取关键字最⼩(或最⼤)的元素加⼊有序⼦序列。
在这里插入图片描述
在这里插入图片描述

6.2 堆排序

堆排序:每⼀趟将堆顶元素加⼊有序⼦序列(与待排序序列中的最后⼀个元素交换),并将待排序元素序列再次调整为⼤根堆
(小元素不断“下坠”)

注意:基于“⼤根堆”的堆排序得到“递增序列”

若n个关键字序列L[1…n] 满⾜下⾯某⼀条性质,则称为堆(Heap):
① 若满⾜:L(i)≥L(2i)且L(i)≥L(2i+1) (1 ≤ i ≤n/2 )—— ⼤根堆(⼤顶堆)
② 若满⾜:L(i)≤L(2i)且L(i)≤L(2i+1) (1 ≤ i ≤n/2 )—— ⼩根堆(⼩顶堆)

1)建⽴⼤根堆
思路:把所有⾮终端结点都检查⼀遍,是否满足⼤根堆的要求,如果不满⾜,则进⾏调整。

检查当前结点是否满⾜ 根≥左、右,若不满⾜,将当前结点与更⼤的⼀个孩⼦互换。
若元素互换破坏了下⼀级的堆,则采⽤相同的⽅法继续往下调整(⼩元素不断“下坠”)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2)在堆中插⼊新元素
对于小根堆,新元素放到表尾,与⽗节点对⽐,若新元素⽐⽗节点更小,则将⼆者互换。新元素就这样⼀路“上升”,直到⽆法继续上升为止。

3)在堆中删除元素
被删除的元素⽤堆底元素替代,然后让该元素不断“下坠”,直到⽆法下坠为止。
在这里插入图片描述

7. 归并排序(Merge Sort)

归并:把两个或多个已经有序的序列合并成⼀个。
在这里插入图片描述
在这里插入图片描述
原本两个序列无序
在这里插入图片描述

在这里插入图片描述

8. 基数排序(Radix Sort)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9. 外部排序

在这里插入图片描述

9.1 败者树

败者树解决的问题:使⽤多路平衡归并可减少归并趟数,但是⽤⽼⼟⽅法从 k 个归并段选出⼀个最⼩/最⼤元素需要对⽐关键字 k-1 次,构造败者树可以使关键字对⽐次数减少到 ⌈log2k⌉。

败者树——可视为⼀棵完全⼆叉树(多了⼀个头头)。k个叶结点分别是当前参加⽐较的元素,⾮叶⼦结点⽤来记忆左右⼦树中的“失败者”,⽽让胜者往上继续进⾏⽐较,⼀直到根结点。

9.2 置换-选择排序

设初始待排⽂件为FI,初始归并段输出⽂件为FO,内存⼯作区为WA,FO和WA的初始状态为空,WA可容纳w个记录。置换-选择算法的步骤如下:
1)从FI输⼊w个记录到⼯作区WA。
2)从WA中选出其中关键字取最⼩值的记录,记为MINIMAX记录。
3)将MINIMAX记录输出到FO中去。
4)若FI不空,则从FI输⼊下⼀个记录到WA中。
5)从WA中所有关键字⽐MINIMAX记录的关键字⼤的记录中选出最⼩关键字记录,作为新的MINIMAX记录。
6)重复3)~5),直⾄在WA中选不出新的MINIMAX记录为⽌,由此得到⼀个初始归并段,输出⼀个归并段的结束标志到FO中去。
7)重复2)~6),直⾄WA为空。由此得到全部初始归并段。

9.3 最佳归并树

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值