二路归并和多路归并排序.pdf

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
11.3最佳归并树(续)
8个初始归并段:{9, 12, 18, 3, 17, 2, 6, 24} 补虚段后的集合: {0, 9, 12, 18, 3, 17, 2, 6, 24} {0, 9, 12, 18, 3, 17, 2, 6, 24} {5, 9, 12, 18, 17, 6, 24} {20, 12, 18, 17, 24} {20, 47, 24} {91}
10.5归并排序
2-路归并排序
算法思想:
DS/SS
归并排序(Merging Sort)的基本操作是“归并”:将两个或两个以上 的有序表组合成一个新的有序表。 2-路归并过程:假设初始序列含n个元素,看成n个子序列,两两 归并,得到“n/2取上整”个长度为2或为1的有序子序列;再两两归并, 如此重复,直至得到一个长度为n的有序序列为止。 整个排序过程共进行log2n趟。每一趟归并调用“(n/(2h))取上整”次 核心归并算法,将SR[1..n]中前后相邻长度为h的有序段进行两两归并, 得到前后相邻、长度为2h的有序段,并存放在TR[1..n]中。交替进行。
11
11.1外存信息的存取
磁带信息存取
DS/SS
• 磁带为一种顺序存取设备 • 磁带上信息成块组织,一块为一次存取单位 • 磁带上读取一块信息所需时间TI/O=ta + n*tw * ta 为延迟时间,读/写头到达传输信息所在物理块起始位 置所需时间; * tw为传输一个字符的时间 • 检索和修改信息不方便(有时需要倒转) • 顺序存取设备主要用于处理变化少、只进行顺序存取的大量 数据
性能分析:
时间复杂度T(n)= O(d(n+rd)) (rd为每个关键字基数) 每一趟:分配时间复杂度O(n) 每一趟:收集时间复杂度O(rd) 供d趟: d(n+rd) 空间复杂度S(n)=O(rd) (2rd个队列指针) 稳定性: 基数排序方法是稳定的排序方法 适用情况: *元素个数n很大且关键字较小
17
11.3最佳归并树(续)
DS/SS
• 对k-路归并而言,如果初始归并段个数m不是k的倍 数,则附加长度为零的“虚段”。然后按照哈夫曼树 构造原则,权为零的叶子应离树根最远。 • 附加虚段的数目: 若(m-1) MOD (k-1) =0,则不需要附加虚段;否 则附加k-(m-1) MOD (k-1) –1个虚段。 例如,当k=3时,三叉树中只有度为3和0的结 点,必有n3=(n0-1)/2,由于n3为整数,则(n0-1) MOD 2 =0。对3-路归并,只有当m为偶数时,才需增加 一个虚段。
008 505 f[0] f[1] 109 f[2] 930 f[3] 930 f[4] 063 f[5] 269
269 063 f[6] 278 278 f[7] 083
184 083 f[8] 184 f[9] 589
7
ຫໍສະໝຸດ Baidu
505
008
收集
10.6基数排序(续)
505 008 e[0] 083 109 e[1] e[2] 930 e[3] 063 e[4] 269 e[5] 278 e[6] 083 e[7]
DS/SS
91 20 5 6 3 9 24 12 47 17 18
16
11.3最佳归并树
DS/SS
• 初始归并段长度互不相等时,多路平衡归并效率与 归并方案有关 • 归并过程用归并树描述时,树中叶子结点权值为初 始归并段长度。 • 树的带权路径长度之和对应归并所需对外存进行的 读/写次数。 • 要使归并效率最好,m个初始归并段归并过程应该 是树的带权路径长度之和为最小的归并树描述的归 并过程。即求m个结点的多叉哈夫曼树的过程。
1
10.5归并排序(续)
DS/SS
void Merge(RcdType SR[] , RcdType SR[] , int i, int m, int n){ //核心归并算法 //将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] for (j =m+1, k =i; i<=m&& j<=n; ++k) { //将SR中元素由小到大地并入TR if LQ(SR[i].key,SR{j].key) TR[k] = SR[i++]; else TR[k] = SR[j++]; } if(j<=m) TR[k..n] = SR[i..m]; if(j<=n) TR[k..n] = SR[j..n]; } // Merge
5
10.6基数排序(续)
278 109 e[0] 063 e[1] e[2] 930 e[3] 589 e[4] 184 e[5] 505 e[6] 269 e[7]
DS/SS
008 e[8]
083 e[9] 269
分 配
930 f[0] 930 063 f[1] 083 f[2]
083 063 f[3] 184 184 f[4] 505 505 f[5] 278 f[6] 008 f[7] 109
008 278 f[8] 589
589 109 f[9] 269
6
收集
10.6基数排序(续)
930 063 e[0] 109 083 e[1] e[2] 184 e[3] 505 e[4] 278 e[5] 008 e[6] 109 e[7]
DS/SS
589 e[8] 589
269 e[9]
分 配
DS/SS
184 e[8]
589 e[9]
分 配
063 008 f[0]
184 109 f[1] 083
278 269 f[2] f[3] 109 f[4] 184
589 505 f[5] 269 f[6] 278 f[7] 505 f[8] 589 930 f[9] 930
8
008
063
收集
10.6基数排序(续)
2
//将剩余的SR[i..m]复制到TR //将剩余的SR[j..n]复制到TR
10.5归并排序(续)
2-路归并排序
性能分析:
时间复杂度T(n)= O(nlog2n) 空间复杂度S(n)=O(n) (每一趟交替进行) 稳定性: 归并排序方法是稳定的排序方法 适用情况: *元素个数较多(辅助外排序情况下常用)
15
11.2外部排序的方法(续)
DS/SS
例:假设含10,000个记录的文件,分成10个初始归并段其中每一 段都含1000个记录。设外存每个物理块容纳200个记录。 每一趟归并需进行50次“读”和50次“写”。 *若进行2-路归并: m=10; s=4;d=500(四趟归并加上内部排序时所需进行 的读/写次数)(d是影响外排效率的关键) *若进行5-路归并: m=10; s=2;d=300(两趟归并加上内部排序时所需进行 的读/写次数) K的选择并非越大 可采用置换-选择排序, 让各个初始归并段长度不 *若进行k-路归并:越好,要综合考虑 等,从而减少m s=logkm取下整;增加k或减少m便能减少s
14
11.2外部排序的方法(续)
DS/SS
• 外部排序所需总时间= 内部排序(产生初始归并段)所需时间 m*tIS +外存信息读写时间 d*tIO +内部归并所需时间 s*utmg 其中: tIS是为得到一个初始归并段进行内部排序所需时 间的均值; tIO是进行一次外存读/写时间的均值;utmg 是对u 个记录进行内部归并所需时间;m为经过内部排序之后得到 的初始归并段的个数;s为归并的趟数;d为总的读/写次数。 一般而言,tIO取决于所用的外存设备, 且tIO >> tmg 。因 此,提高外排效率应主要着眼于减少外存信息读写的次数d。
DS/SS
*n较大时,归并排序所需时间较堆排序省,但辅助空间多
3
10.6基数排序
• •
DS/SS


基数排序(Radix Sorting):借助多关键字排序的思想对单逻辑关键字进 行排序的方法。 多关键字排序: n个元素的序列 {R1,R2,…, Rn},每个元素Ri有d个关键字 (K0i, K1i,…, Kd-1i),则称序列对关键字(K0, K1,…, Kd-1)有序: 对于任意两个 元素Ri和Rj都满足下列有序关系: (K0i, K1i,…, Kd-1i)< (K0j, K1j,…, Kd-1j)。其中K0称为最主位关键字, Kd-1 称为最次位关键字。 最高位优先(Most Significant Digit first):先对最主位关键字K0 进行排序, 将序列分成若干子序列,每个子序列中的元素都具有相同的K0 值,然 后分别就每个子序列对关键字K1进行排序,按K1值不同再分成若干更小 的子序列,依次重复,直至对Kd-2进行排序之后得到的每一子序列中的 元素都具有相同的关键字(K0, K1,…, Kd-2) ,而后分别每个子序列对Kd-1 进行排序,最后将所有子序列依次联接在一起称为一个有序序列。 最低位优先(Least Significant Digit first):从最次位关键字Kd-1起进行排序。 然后再对高一位的关键字Kd-2进行排序,依次重复,直至对K0进行排序 后便成为一个有序序列。 4
DS/SS
9
10.7内部排序方法比较
排序方法 直接插入排序 希尔排序 冒泡排序 快速排序 简单选择排序 堆排序 2-路归并排序 链式基数排序 时间性能 O(n2) O(n1.3) O(n2) O(nlog2n) O(n2) O(nlog2n) O(nlog2n) O(d(n+rd)) 空间性能 O(1) O(1) O(1) O(log2n) O(1) O(1) O(n) O(rd) 稳定性 稳定 不稳定 稳定 不稳定 不稳定 不稳定 稳定 稳定
12
11.1外存信息的存取(续)
磁盘信息存取
DS/SS
• 磁盘为一种直接存取设备 • 磁盘上信息以扇段(块)为单位组织,一扇段为一次存取单位 • 磁盘上读取一块信息所需时间TI/O=tseek + tla + n*twm * tseek 为寻查时间,即读/写头定位时间(确定信息所在柱 面; (磁盘读写信息时间主要花在寻查时间上) * tla 为等待时间(latency time),即等待信息块的初始位置 转到读写头下的时间; * twm为传输时间 • 尽量将相关信息放在同一柱面上或邻近柱面上,以提高寻查 效率
DS/SS
适用情况 n小;初始序列基本有序
n小;初始序列基本有序 初始序列无序 n小 n大;只求前几位 n很大 n大;关键字值小
10
教学内容---第十一章
1.绪论 2.线性表 3.栈、队列和串 4.数组 5.广义表 6.树和二叉树
DS/SS
7.图 8.动态存储管理 9.查找 10.内部排序 11.外部排序 12.文件
13
11.2外部排序的方法
DS/SS
• 外部排序 由两个阶段组成: 产生初始归并段。按可用内存大小,将外存上含n 个记录的文件分成若干长度为L的段(segment),依 次读入内存并利用内排方法对它们进行排序,并将 排序后得到的有序段(归并段或顺串)重新写入外存 归并。对这些初始归并段进行逐趟归并,使归并段 逐渐由小到大,直至得到整个有序文件。 • 归并效率是影响外部排序效率的关键 • 归并本身花费时间并不多,主要时间花费在内外存 间元素的交换上
10.6基数排序(续)
链式基数排序 借助“分配”和“收集”两种操作对单逻辑关键字进行排序。
算法思想:
DS/SS
有的单逻辑关键字可以看成由若干个关键字复合而成。比如数值, 设0<=K<=999,则K可以看作三个关键字(K0, K1, K2)组成(d=3),其中 是K0 是百位数, K1是十位数, K2是个位数,且0<= Ki<=9(RADIX=10)。 由于每个关键字范围都相同,则按LSD进行排序更方便,即从最低位 关键字字起,按关键字的不同值将序列中元素“分配”到RADIX个队列 中后再“收集”之,如此重复d次,即可实现基数排序。 具体而言,第一趟分配对最低位关键字(个位数)进行,将初始序 列中元素分配到RADIX个队列中去,每个队列中的元素关键字的个位 数相等。f[i]和e[i]分别为第i个队列的头指针和尾指针;第一趟收集是 改变所有非空队列的队尾元素的指针域,令其指向下一个非空队列的 对头元素,重新将RADIX个队列中的元素链接成一个链表。第二趟分 配,第二趟收集及第三趟分配,第三趟收集分别对十位数和百位数进 行的,过程相同。
相关文档
最新文档