《数据结构》第8章 排序
第8章 排序
一定要掌握:快速排序+堆排序
冒泡排序与简单选择排序的区别:两者都是依次选出最小(最大),但前者需要两两交换,后者直接选出插入该放的位置就结束了。
需要内存最大:快速排序<归并排序<基数排序
8.1 基本概念和排序方法概述
8.2 插入排序——从左到右逐一插入已排序的
方法1:直接插入排序(Straight Insert Sort)——顺序寻找插入位置
1.基本思想
2.算法步骤
3.性能分析(O(n2) O(1) 稳定)
方法2:折半插入排序(Binary Insert Sort)——折半寻找插入位置
1.基本思想
2.算法步骤
要排序的数<m,比较前半部分,high=m-1
要排序的数≥m,比较后半部分,low=m+1
3.性能分析(O(n2) O(1) 稳定)
方法3: Shell 排序(Shell Sort)=缩小增量排序(Diminishing-increment sort)——分组后进行直接插入排序
1.基本思想
2.算法步骤
3.性能分析(O(n1.3) O(0) 不稳定)
8.3 交换排序 ——两两比较待排序关键字
方法1:冒泡排序(Bubble Sort)——从左到右比较,找最大,石沉;从右到左比较,找最小,冒泡
1.基本思想
2.算法步骤
原序列:17,3,25,14,20,9
第一趟:交换5次,冒出第1个泡
17,3,25,14,20,9
17,3,25,14,9,20
17,3,25,9,14,20
17,3,9,25,14,20
17,3,9,25,14,20
3,17,9,25,14,20
第二趟:交换4次,冒出第2个泡
3,17,9,25,14,20
3,17,9,25,14,20
3,17,9,14,25,20
3,17,9,14,25,20
3,9,17,14,25,20
第三趟:交换3次,冒出第3个泡
3,9,17,14,25,20
3,9,17,14,20,25
3,9,17,14,20,25
3,9,14,17,20,25
第四趟:交换2次,冒出第4个泡
3,9,14,17,20,25
3,9,14,17,20,25
3,9,14,17,20,25
不动,可以停止了
3.性能分析(O(n2) O(1) 稳定)
方法2:【重点】快速排序(Quick Sort)——插旗杆
1.基本思想
2.算法步骤(3道例题)
每次都将最前面的一个元素作为控制值。low>high就换,low<high就动空房子(控制值/界点)另一头指针。当所有旗杆中间的间隔≤1时,整个快速排序结束。
旗杆 待排序
☐ 21 25 49 25* 16 08
第一趟快速排序:21作为旗杆
21 ☐ 25 49 25* 16 08——low(☐)>high(08),交换
21 08 25 49 25* 16 ☐——low++,low>high,交换
21 08 ☐ 49 25* 16 25——high–,low>high,交换
21 08 16 49 25* ☐ 25——low++,low>high,交换
21 08 16 ☐ 25* 49 25——high–,low<high,不交换,high–,low=high,第一趟快速排序结束
☐ 08 16 21 25* 49 25——第一趟快速排序结果,旗杆左边都比它小,右边都比它大
第二趟快速排序:08作为旗杆
08 ☐ 16 21 25* 49 25——low(☐)<high(16),不交换,high–
08 ☐ 16 21 25* 49 25——low=high,第二趟快速排序结束
☐ 08 16 21 25* 49 25——第二趟快速排序结果
第三趟快速排序:25*作为旗杆
25* 08 16 21 ☐ 49 25——low(☐)=high(25),不交换,high–
25* 08 16 21 ☐ 49 25——low(☐)<high(49),不交换,high–
25* 08 16 21 ☐ 49 25——low=high,第三趟快速排序结束
☐ 08 16 21 25* 49 25——第三趟快速排序结果
第四趟快速排序:49作为旗杆
49 08 16 21 25* ☐ 25——low>high,交换
49 08 16 21 25* 25 ☐ ——low++,low=high,第四趟快速排序结束
☐ 08 16 21 25* 25 49——第四趟快速排序结果
第一趟快速排序
第二趟快速排序
第三趟快速排序
第四趟快速排序
3.性能分析(O(nlog2n) O(log2n) 不稳定)
8.4 选择排序——依次将未排序组中关键字码最小的记录插入已排序组中
方法1:简单选择排序(Simple selection Sort)——一般用来编程,直接选出插入该放的位置
1.基本思想
2.算法步骤
3.性能分析(O(n2) O(1) 不稳定)
方法2:树型选择排序(Tournament Sort)——搞最小,换∞
1.基本思想
2.算法步骤
3.性能分析(O(nlog2n) O(n) 稳定)
方法3:【重点】堆排序(Heap Sort)
1.定义
2.堆的性质
3.算法步骤
1.初始堆的建立
如何初始化一个堆?
1. 按照完全二叉树的方法顺序地将要排序的数据连成一棵树;
2. 从最后一个叶子结点开始,自下向上,自右向左地将每一个孩子结点与双亲结点进行比较(加速:将每一个有孩子的结点进行比较)。如果是小根堆,只要双亲大于孩子结点就要交换。
3. 当双亲与孩子结点进行交换后,还要比较该孩子与其孩子的大小,这样层层比较,才能得到最终排序。
2.初始化后堆排序过程——根和最后一个节点交换+重新成堆+交换+成堆+…
4.性能分析(O(nlog2n) O(1) 不稳定)
8.5 归并排序——对两个或两个以上的有序结点序列的合并
方法1: 2-路归并——两两归并
1.基本思想
2.算法步骤
3.性能分析(O(nlog2n) O(n) 稳定)
方法2:多路归并排序
8.6 基数排序——分配 收集
1.定义
2.算法步骤