归并排序-ppt课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中;再收集,……,重复直到“最高位”为止, 这时,以按关键字有序。
例如:对下列这组关键字进行基数排序 {209, 386, 768, 185, 247, 606, 230, 834, 539 }
基数 为10 0 1 2 3 4
5
6
7
8
9
分别按“个位”、“十位”、“百位”进行3趟分配 与收集
10.6.2 链式基数排序
(5,24,35,74,222) (19,23,30)
(
)
两路归并动画演示
i
( 5
[s]
i
i
j
( 19
[m+1] [m]
j 23
j 30 )
[t]
j
24 35 74 222 )
( k
)
k
k
k
k
k
10.5 归并排序
void Merge (int r[ ], int r1[ ], int s, int m, int t ) { /***将有序列r[s..m]和r[m+1..t]两路归并为r1[ ]***/ 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++]; //后一个子序列剩下的 }
f[0]
184
109 f[1]
278 269 f[2] f[3] f[4]
589 505 f[5] f[6] f[7] f[8] 有 序
930
f[9]
第三趟收集:
008 063 083 109 184 269 278 505
589
930
10.6.2 链式基数排序
基数 排序 算法
//分配 //收集
10.6.2 链式基数排序
10.5 归并排序
总结
最好、最坏、平均时间复杂度均为O(nlogn);
空间复杂度高,为O(n);
是高效算法中唯一“稳定”的排序方法; 较少用于内部排序,多用于外部排序。
10.6 基数排序
基本思想
基数排序是采用“分配”与“收集”的 办法,用对多关键码进行排序的思想实现对 单关键码进行排序的方法。
然后,每堆再按“面值”排;
最后,收成一堆。
扑克牌 “排序” 为例
10.6 基数排序
“面值”优先
先分成13堆; 每堆再按“花色”排;
扑克牌 “排序” 为例
10.6 基数排序
多关键码排序
假设有n个记录……的序列 { R1, R2, …,Rn} 每个记录Ri中含有d个关键字(Ki0, Ki1, …,Kid-1)。则 有序是指:对于序列中任意两个记录Ri和Rj(1≤i<j≤n) 都满足下列(词典)有序关系: (Ki0, Ki1, …,Kid-1)< (Kj0, Kj1, …,Kjd-1) 其中K0被称为“最高”位关键字,Kd-1被称为 “最低” 位关键字。
10.6 基数排序
多关键码排序问题
以扑克牌排序为例。每张扑克牌有两个 “关键码”:花色和面值。其有序关系为: 花色: 面值: 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A
10.6 基数排序
“花色”优先
先分成4堆;
分配 算法
10.6.2 链式基数排序
收集 算法
10.6.2 链式基数排序
性能分析
若每个关键码有d 位,需要重复执行d 趟“分配”
与“收集”。而每趟对n 个对象进行“分配”, 对 r 个队列进行“收集”。总时间复杂度为 O(d (n+r))。
若基数 r 相同,对于数据个数较多而关键码位数
较少的情况,使用链式基数排序较好。
初始关键字: [49] [38] [65] [97] [76] [13] [27] 一趟归并后: [38 二趟归并后: [38 49] [65 49 65 97] [13 97] [13 76] [27] 27 76]
三趟归并后: [13
27 38
49
65
76
97]
10.5 归并排序
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); //递归地排序子序列 SR[m+1..t] Merge (TR2, TR1, s, m, t); //归并 } }
10.6 基数排序
多关键码排序
实现多关键码排序通常有两种方法:
低位码优先LSD
高位码优先MSD
( 3 J
8
9
9 3 3
3 7 7 J 9
1
7 ) 9 9
先按花色: 8 1 再按面值: 1 8
9 3 J 3
10.6.2 链式基数排序
对于单关键字,可以看成是由多个数位构成的 多关键字; 基数排序是典型的LSD排序方法,利用“分配” 和“收集”两种运算对单关键码进行排序。
10.5 归并排序
基本思想
将两个或两个以上的有序子序列“归并”为一个
有序序列。 在内部排序中,通常采用的是2-路归并排序。即: 将两个位置相邻的有序子序列归并为一个有序序 列。
有序
r[i]
有序
r[i]
有序
r[n]
r[m] r[m+1] r[n]
10.5 归并排序
如何进行两路归并?
将两个有序表的元素进行比较,小者复制到 目标表中。
一 趟 分 配
930 f[百度文库] f[1] f[2]
083
063 f[3] 184 f[4] 505 f[5] f[6] f[7]
008
278 f[8]
589
109 f[9]
一趟收集:
930 063 083 184 505 278 008 109 589 269
第一趟收集:
930
r[0] 109 二 趟 分 配
n越大,采用改进的排序方法越合适。
因为n越小,O(n2)同O(nlog2n)的差距越小, 并且输入和调试简单算法比 高效算法要容易
10.6 内部排序方法的比较讨论
数据的信息量比较
信息量越大,移动记录所花费的时间就越多, 所以对记录的移动次数较多的算法不利。
排序方法
直接插入排序
最好情况 O(n)
希 尔 排 序 O(nlog2n)
快 速 排 序 O(nlog2n) 堆 排 序 O(nlog2n)
O(nlog2n)
O(n2)
O(n2)
O(n2)
O(nlog2n)
O(nlog2n)
O (nlog2n)
O(nlog2n)
归 并 排 序 O(nlog2n)
排序方法 直 接 插 入 排 序 希 冒 尔 泡 排 排 序 序
例
083
r[2]
063
r[1]
184
r[3]
505
r[4]
278
r[5]
008
r[6]
109
r[7]
589
r[8] 589
269
r[9]
008
505 f[0] f[1] f[2] 930 f[3] f[4] f[5]
269
063 f[6] 278 f[7]
184
083 f[8] f[9]
第二趟收集:
实现思想
为了便于分配与收集,采用链表为存储结构
r个桶用r个链式队列表示;
收集的时候直接将队列的头尾指针连接实现;
初始状态:
278 r[0] 109 r[1] 063 r[2] 930 r[3] 589 r[4] 184 r[5] 505 r[6] 269 r[7]
例
008 r[8] 083 r[9] 269
10.5 归并排序
原理
假设初始序列含有n个记录,则可看成n 个有序的子序列,每个子序列长度为1。然后 两两归并,得到n/2个长度为2或1的有序子 序列;再两两归并,……如此重复,直至得 到一个长度为n的有序序列为止。
初始时: [49] [38] [65] [97] [76] [13] [27]
505 008 109 930 063 269 278 083 184 589
第二趟收集:
505 e[0] 083 008 e[1] 109 e[2] 930 e[3] 063 e[4] 269 e[5] 278 e[6] 083 e[7]
例
184 e[8] 589 e[9]
三 趟 063 分 配 008
结束,谢谢!
最坏情况 O(n2)
平均情况 O(n2)
冒泡排序
直接选择排序
0
0
O(n2)
O(n)
O(n2)
O(n)
10.6 内部排序方法的比较讨论
数据的分布情况比较
当待排序数据初始有序时,插入排序和冒泡排 序能达到O(n)的时间复杂度; 对于快速排序而言,这是最坏的情况,此时性 能蜕化为O(n2);
选择排序、堆排序和归并排序的性能不受影响。
简 单 选 择 排 序 堆 归 并 排 排 序 序
10.6 内部排序方法的比较讨论
简单性
一类是简单算法,包括直接插入排序、直接
选择排序和冒泡排序,
另一类是改进后的算法,包括希尔排序、堆
排序、快速排序和归并排序,这些算法较复杂
10.6 内部排序方法的比较讨论
待排序记录个数比较
n越小,采用简单排序方法越合适。
10.5 归并排序
性能分析
一趟归并操作是将r[1]~r[n]中相邻的长 度为h的有序序列进行两两归并,这需要O(n) 时间。整个归并排序需要进行log2n趟,因此, 总的时间代价是O(nlog2n)。
10.5 归并排序
性能分析
算法在执行时,需要占用与原始记录序列 同样数量的存储空间,因此空间复杂度为O(n)。
辅助空间 O(1) O(1) O(1)
空间复杂度
快
速
排
序
O(log2n) ~O(n)
O(1) O(1) O(n)
简 单 选 择 排 序 堆 归 并 排 排 序 序
排序方法 直 接 插 入 排 序 希 冒 尔 泡 排 排 序 序
辅助空间
算法稳定性
稳定 不稳定 稳定 不稳定 稳定 不稳定 稳定
快
速
排
序
例如:对下列这组关键字(每个关键字有3位) {209, 386, 768, 185, 247, 606, 230, 834, 539 }
10.6.2 链式基数排序
基本思想
从关键字的最“低位”开始,将关键字分配到
r(基数)个堆(桶)中;
按桶的编号将关键字收集起来; 然后,以“次低位”将关键字又分配到r个桶
需要增加 n+2r个附加链接指针。
稳定的排序方法
10.6 内部排序方法的比较讨论
对排序算法应该从以下几个方面综合考虑:
⑴时间复杂性; ⑵空间复杂性; ⑶稳定性; ⑷算法简单性; ⑸待排序记录个数n的大小; ⑹记录本身信息量的大小; ⑺关键码的分布情况
时间复杂度
排序方法 直接插入排序 冒 泡 排 序 简单选择排序 平均情况 O(n2) O(n2) O(n2) 最好情况 O(n) O(n1.3) O (n) 最坏情况 O(n2) O(n2) O(n2)