数据结构009

上传人:kms****20 文档编号:50894910 上传时间:2018-08-11 格式:PPT 页数:114 大小:2.28MB
返回 下载 相关 举报
数据结构009_第1页
第1页 / 共114页
数据结构009_第2页
第2页 / 共114页
数据结构009_第3页
第3页 / 共114页
数据结构009_第4页
第4页 / 共114页
数据结构009_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《数据结构009》由会员分享,可在线阅读,更多相关《数据结构009(114页珍藏版)》请在金锄头文库上搜索。

1、10.1 概述10.2 插入排序10.3 快速排序10.4 堆排序 10.5 归并排序10.6 基数排序10.7 各种排序方法的综合比较10.8 外部排序10.1 概 述一、排序的定义 二、内部排序和外部排序三、内部排序方法的分类一、什么是排序?排序是计算机内经常进行的一种操作 ,其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75 调整为14, 23, 36, 49, 52, 58, 61 ,75, 80, 97一般情况下, 假设含n个记录的序列为 R1, R2, , Rn 其相应的关

2、键字序列为 K1, K2, ,Kn 这些关键字相互之间可以进行比较,即在 它们之间存在着这样一个关系 :Kp1Kp2Kpn按此固有关系将上式记录序列重新排列为 Rp1, Rp2, ,Rpn 的操作称作排序。二、内部排序和外部排序若整个排序过程不需要访问外存便 能完成,则称此类排序问题为内部排序; 反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。三、内部排序的方法内部排序的过程是一个逐步扩大记录的有序序列长度的过程。经过一趟排序有序序列区无 序 序 列 区有序序列区无 序 序 列 区基于不同的“扩大” 有序序列长度的方法,内部排序方法大致可分下

3、列几种类型:插入类交换类选择类归并类其它方法待排记录的数据类型定义如下:#define MAXSIZE 1000 / 待排顺序表最大长度typedef int KeyType; / 关键字类型为整数类型typedef struct KeyType key; / 关键字项InfoType otherinfo; / 其它数据项 RcdType; / 记录类型typedef struct RcdType rMAXSIZE+1; / r0闲置int length; / 顺序表长度 SqList; / 顺序表类型1. 插入类将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长

4、度。2. 交换类通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。3. 选择类从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。4. 归并类通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。5. 其它方法10. 2 插 入 排 序有序序列R1i-1Ri无序序列 Rin一趟直接插入排序的基本思想:有序序列R1i无序序列 Ri+1n实现“一趟插入排序”可分三步进行:3将Ri 插入(复制)到Rj+1的位置上。2将Rj+1i-1中的所有记录均

5、后移一个位置;1在R1i-1中查找Ri的插入位置,R1j.key Ri.key =high+1; -j )L.rj+1 = L.rj; / 记录后移L.rhigh+1 = L.r0; / 插入low = 1; high = i-1;while (low0i = lastExchangeIndex; / 本趟进行过交换的/ 最后一个记录的位置if (Rj+1.key =pivotkey) -high;RlowRhigh; while (low=pivotkey)- high; / 从右向左搜索 Rlow = Rhigh; while (low0; -i )HeapAdjust ( H.r, i,

6、 H.length ); / 建大顶堆 for ( i=H.length; i1; -i ) H.r1H.ri; / 将堆顶记录和当前未经排序子序列/ H.r1i中最后一个记录相互交换HeapAdjust(H.r, 1, i-1); / 对 H.r1 进行筛选 如何“建堆”?两个问题:如何“筛选”?定义堆类型为:typedef SqList HeapType;/ 堆采用顺序表表示之所谓“筛选”指的是,对一棵左/右子树 均为堆的完全二叉树,“调整”根结点使整个二叉树也成为一个堆。堆堆筛选98814973556412362740例如:是大顶堆12但在 98 和 12 进行互换之后,它就不是堆了,因

7、此,需要对它进行“筛选”。98128173641298比较比较void HeapAdjust (RcdType / 暂存 Rs for ( j=2*s; j= Rj.key ) break; / 再作“根”和“子树根”之间的比较,/ 若“=”成立,则说明已找到 rc 的插/ 入位置 s ,不需要继续往下调整Rs = Rj; s = j; / 否则记录上移,尚需继续往下调整if ( jm / 左/右“子树根”之间先进行相互比较/ 令 j 指示关键字较大记录的位置建堆是一个从下往上进行“筛选”的过程。40554973816436122798例如: 排序之前的关键字序列为12368173499881

8、7355现在,左/右子树都已经调整为堆,最后 只要调整根结点,使整个二叉树是个“堆 ”即可。98494064361227堆排序的时间复杂度分析:1. 对深度为 k 的堆,“筛选”所需进行的关键字 比较的次数至多为2(k-1);3. 调整“堆顶” n-1 次,总共进行的关键 字比较的次数不超过2 (log2(n-1)+ log2(n-2)+ +log22) 2n(log2n) 因此,堆排序的时间复杂度为O(nlogn)。2. 对 n 个关键字,建成深度为h(=log2n+1)的堆, 所需进行的关键字比较的次数至多 4n;10.5 归 并 排 序归并排序的过程基于下列 基本思想进行:将两个或两个以

9、上的有序 子序列 “归并” 为一个有序序列。在内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻的记录有序子序列归并为一个记录的有序序列。有 序 序 列 Rln有序子序列 Rlm有序子序列 Rm+1n这个操作对顺序表而言,是轻而易举的。void Merge (RcdType SR, RcdType i=m +k) / 将SR中记录由小到大地并入TRif (SRi.key=SRj.key) TRk = SRi+;else TRk = SRj+; if (i=m) TRkn = SRim;/ 将剩余的 SRim 复制到 TRif (j=n) TRkn = SRjn;/ 将剩余的 SRjn

10、复制到 TR归并排序的算法如果记录无序序列 Rst 的两部分 Rs(s+t)/2 和 R(s+t)/2+1t分别按关键字有序,则利用上述归并算法很容易将它们归并成整个记录序列是一个有序序列。由此,应该先分别对这两部分进行 2-路归并排序。例如: 52, 23, 80, 36, 68, 14 (s=1, t=6) 52, 23, 80 36, 68, 14 52, 2380 52 23, 52 23, 52, 8036, 6814366836, 6814, 36, 68 14, 23, 36, 52, 68, 80 23void Msort ( RcdType SR, RcdType else

11、/ Msort m = (s+t)/2;/ 将SRst平分为SRsm和SRm+1tMsort (SR, TR2, s, m);/ 递归地将SRsm归并为有序的TR2sm Msort (SR, TR2, m+1, t);/递归地SRm+1t归并为有序的TR2m+1tMerge (TR2, TR1, s, m, t);/ 将TR2sm和TR2m+1t归并到TR1stvoid MergeSort (SqList / MergeSort容易看出,对 n 个记录进行归并排序的 时间复杂度为(nlogn)。即:每一趟归并的时间复杂度为 O(n),总共需进行 log2n 趟。10.6 基 数 排 序基数排序

12、是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。多关键字的排序链式基数排序一、多关键字的排序n 个记录的序列 R1, R2, ,Rn对关键字 (Ki0, Ki1,Kid-1) 有序是指:其中: K0 被称为 “最主”位关键字Kd-1 被称为 “最次”位关键字对于序列中任意两个记录 Ri 和 Rj(1ijn) 都满足下列(词典)有序关系:(Ki0, Ki1, ,Kid-1) (Kj0, Kj1, ,Kjd-1)实现多关键字排序通常有两种作法:最低位优先LSD法最高位优先MSD法先对K0进行排序,并按 K0 的不同值将记录序列分成若干子序列之后,分别对 K1 进行排序,.,

13、依次类推,直至最后对最次位关键字排序完成为止。先对 Kd-1 进行排序,然后对 Kd-2 进行排序,依次类推,直至对最主位 关键字 K0 排序完成为止。排序过程中不需要根据 “前一个” 关键字的排序结果,将记录序列分割成若干个(“前一个”关键字不同的)子序列。例如:学生记录含三个关键字: 系别、班号和班内的序列号,其中以系别为最主位关键字。无序序列对K2排序 对K1排序对K0排序3,2,301,2,153,1,202,3,182,1,201,2,152,3,183,1,202,1,203,2,303,1,202,1,201,2,153,2,302,3,181,2,152,1,202,3,183

14、,1,203,2,30LSD的排序过程如下:二、链式基数排序假如多关键字的记录序列中,每个关 键字的取值范围相同,则按LSD法进行排 序时,可以采用“分配-收集”的方法,其好处是不需要进行关键字间的比较。对于数字型或字符型的单关键字,可 以看成是由多个数位或多个字符构成的多 关键字,此时可以采用这种“分配-收集”的办法进行排序,称作基数排序法。例如:对下列这组关键字209, 386, 768, 185, 247, 606, 230, 834, 539 首先按其 “个位数” 取值分别为 0, 1, , 9“分配” 成 10 组,之后按从 0 至 9 的顺序将 它们 “收集” 在一起;然后按其 “十位数” 取值分别为 0, 1, , 9 “分配” 成 10 组,之后再按从 0 至 9 的顺序将它们 “收集” 在一起;最后按其“百位数”重复一遍上述操作。在计算机上实现基数排序时,为减少 所需辅助存储空间,应采用链表作存储结 构,即链式基数排序,具体作法为:待排序记录以指针相链,构成一个链表;“分配” 时,按当前“关键字位”所取值,将 记录分配到不同的 “链队列” 中,每个队列中 记录的 “关键字位” 相同; “收集”时,按当前关键字位取值从

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号