归并排序PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
4
10.5 归并排序
❖ 原理
假设初始序列含有n个记录,则可看成n 个有序的子序列,每个子序列长度为1。然后 两两归并,得到n/2个长度为2或1的有序子 序列;再两两归并,……如此重复,直至得 到一个长度为n的有序序列为止。
初始时: [49] [38] [65] [97] [76] [13] [27]
.
5
初始关键字: [49] [38] [65] [97] [76] [13] [27] 一趟归并后: [38 49] [65 97] [13 76] [27] 二趟归并后: [38 49 65 97] [13 27 76] 三趟归并后: [13 27 38 49 65 76 97]
.
6
10.5 归并排序
(5,24,35,74,222) (19,23,30)
(
)
.
2
两路归并动画演示
iii
( 5 24 35 74 222 )
[s]
[m]
jjjj
( 19 23 30 )
[m+1]
[t]
(
)
kk k k k k
.
3
10.5 归并排序
void Merge (int r[ ], int r1[ ], int s, int m, int t ) { /***将有序列r[s..m]和r[m+1..t]两路归并为r1[ ]***/
8
10.5 归并排序
❖ 性能分析
算法在执行时,需要占用与原始记录序列 同样数量的存储空间,因此空间复杂度为O(n)。
.
9
10.5 归并排序
❖ 总结
最好、最坏、平均时间复杂度均为O(nlogn); 空间复杂度高,为O(n); 是高效算法中唯一“稳定”的排序方法; 较少用于内部排序,多用于外部排序。
.
12
10.6 基数排序
❖ “花色”优先
先分成4堆; 然后,每堆再按“面值”排; 最后,收成一堆。
扑克牌 “排序” 为例
.
13
10.6 基数排序
❖ “面值”优先
先分成13堆; 每堆再按“花色”排;
扑克牌 “排序” 为例
.
14
10.6 基数排序
❖ 多关键码排序
假设有n个记录……的序列 { R1, R2, …,Rn}
void Msort ( Elem SR[], Elem TR1[], int s, int t ) { /**** 将SR[s..t]进行归并排序为TR1[s..t]****/ if (s==t) TR1[s] = SR[s];
else { m = (s+t)/2; // 将SR[s..t]分割 Msort (SR, TR1, s, m); // 递归地排序子序列SR[s..m] Msort (SR, TR2, m+1, t); //递归地排序子序列
每个记录Ri中含有d个关键字(Ki0, Ki1, …,Kid-1)。则 有序是指:对于序列中任意两个记录Ri和Rj(1≤i<j≤n) 都满足下列(词典)有序关系:
(Ki0, Ki1, …,Kid-1)< (Kj0, Kj1, …,Kjd-1) 其中K0被称为“最高”位关键字,Kd-1被称为 “最低” 位关键字。
❖ 基数排序是典型的LSD排序方法,利用“分配” 和“收集”两种运算对单关键码进行排序。
例如:对下列这组关键字(每个关键字有3位) {209, 386, 768, 185, 247, 606, 230, 834, 539 }
.
17
10.6.2 链式基数排序
❖ 基本思想
从关键字的最“低位”开始,将关键字分配到 r(基数)个堆(桶)中;
.
10
10.6 基数排序
❖ 基本思想
基数排序是采用“分配”与“收集”的 办法,用对多关键码进行排序的思想实现对 单关键码进行排序的方法。
.
11
10.6 基数排序
❖ 多关键码排序问题
以扑克牌排序为例。每张扑克牌有两个 “关键码”:花色和面值。其有序关系为:
花色: 面值:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A
i=s; j=m+1; k=s; while (i<=m && j<=t) { //两表中元素比较
if (r[i]<=r[j]) r1[k++]=r[i++]; else r1[k++]=r[j++]; } while (i<=m) r1[k++]=r[i++]; //前一个子序列剩下的 while (j<=t) r1[k++]=r[j++]; //后一个子序列剩下的 }
按桶的编号将关键字收集起来;
然后,以“次低位”将关键字又分配到r个桶 中;再收集,……,重复直到“最高位”为止, 这时,以按关键字有序。
.
18
例如:对下列这组关键字进行基数排序 {209, 386, 768, 185, 247, 606, 230, 834, 539 }
基数 为10
0
1
2
3
4
5来自百度文库
6
7
SR[m+1..t] Merge (TR2, TR1, s, m, t); //归并
}
}
.
7
10.5 归并排序
❖ 性能分析
一趟归并操作是将r[1]~r[n]中相邻的长 度为h的有序序列进行两两归并,这需要O(n) 时间。整个归并排序需要进行log2n趟,因此, 总的时间代价是O(nlog2n)。
.
10.5 归并排序
❖ 基本思想
将两个或两个以上的有序子序列“归并”为一个 有序序列。
在内部排序中,通常采用的是2-路归并排序。即: 将两个位置相邻的有序子序列归并为一个有序序 列。
有序 有序
r[i] r[m] r[m+1] r[n]
有序
r[i]
r[n]
.
1
10.5 归并排序
❖ 如何进行两路归并?
将两个有序表的元素进行比较,小者复制到 目标表中。
.
15
10.6 基数排序
❖ 多关键码排序
实现多关键码排序通常有两种方法: 低位码优先LSD 高位码优先MSD
( 3 J 8 9 9 3 1 7 )
先按花色: 8 1 3 7 J 9 3 9 再按面值: 1 8 3 7 9 J 3 9
.
16
10.6.2 链式基数排序
❖ 对于单关键字,可以看成是由多个数位构成的 多关键字;
8
9
分别按“个位”、“十位”、“百位”进行3趟分配 与收集
.
19
10.6.2 链式基数排序
❖ 实现思想
为了便于分配与收集,采用链表为存储结构 r个桶用r个链式队列表示; 收集的时候直接将队列的头尾指针连接实现;