收藏 分享(赏)

数据结构第7章排序.ppt

上传人:yjrm16270 文档编号:6921699 上传时间:2019-04-27 格式:PPT 页数:94 大小:2.23MB
下载 相关 举报
数据结构第7章排序.ppt_第1页
第1页 / 共94页
数据结构第7章排序.ppt_第2页
第2页 / 共94页
数据结构第7章排序.ppt_第3页
第3页 / 共94页
数据结构第7章排序.ppt_第4页
第4页 / 共94页
数据结构第7章排序.ppt_第5页
第5页 / 共94页
点击查看更多>>
资源描述

1、数 据 结 构 第7章 排序,概述,什么是排序? 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的元素序列调整为“有序”的元素序列。 假设含n个记录的序列为 R1, R2, , Rn ,其相应的关键字序列为 K1, K2, ,Kn 。这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系 : Kp1Kp2Kpn (或)按此关系将上面记录序列重新排列为: Rp1, Rp2, ,Rpn 的操作称作排序。,概述,排序的分类 按待排序元素关键字个数分 单关键字排序 多关键字排序 按待排序元素的存储介质分 内部排序:排序过程不需要访问外存便能完成 外部排序:排序过程需要访问外存才能完成

2、,概述,内部排序的类别 插入类:直接插入排序折半插入排序2-路插入排序希尔排序 分划类:冒泡排序快速排序 选择类:简单选择排序堆排序 归并类:2-路归并排序 其他方法:基数排序,概述,排序的两个基本操作 比较两个关键字大小 将记录从一个位置移动到另一个位置 稳定性 待排序列 a1, a2, an,其相应的关键字序列 k1, k2, kn,假设ki = kj ( 1i, jn且i j),且在排序前的序列中ai领先于 aj。若在排序后的序列中ai仍领先于 aj,则称排序结果是稳定的,反之,则称其是不稳定的。 一种排序方法是稳定的,是指对任何序列的排序结果都是稳定的。 一种排序方法是不稳定的,只要举

3、出一个实例说明其排序结果是不稳定的即可。,7.1 插入类排序,插入类排序 将待排序元素逐个插入到已排好序的有序表中,从而得到一个新的有序表。 应用插入类排序思想的算法 直接插入排序 折半插入排序 2-路插入排序 希尔排序,7.1.1 直接插入排序,排序过程 整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。 第i趟直接插入排序的基本思想,直接插入排序例,7.1.1 直接插入排序,直接插入排序算法,/ 直接插入排序,数组data用于存放待排序元素,n为待排序元素个数 template void InsertSort(El

4、emType data, int n) ElemType tmp;int i, j;for (i = 1; i = datai - 1)continue;tmp = datai; / 保存待插入的元素datai = datai - 1;for ( j = i - 1; j 0 / 插入到正确位置 ,7.1.1直接插入排序,算法评价 时间复杂度 最好情况(初始序列正序) 元素比较次数:n-1 元素移动次数:0 最坏情况(初始序列逆序) 元素比较次数:元素移动次数: 平均情况 O(n2),7.1.2 折半插入排序,因为 A0i-1 是一个按关键字有序的序列,则可以利用“折半查找”实现“在A0i-1

5、中查找Ai的插入位置”,如此实现的插入排序为折半插入排序。 减少元素关键字间的比较次数,但元素移动次数不变。,折半插入排序例,折半插入排序算法,7.1.2 折半插入排序,template void BInsertSort(ElemType data, int n) ElemType tmp;int i, j, mid, low, high;for (i = 1; i = low; j-)dataj + 1 = dataj; / 元素后移 datalow = tmp; / 插入到正确位置 ,7.1.3 2-路插入排序,将插入区域分成大致等长的两段,选择性地插入到其中一段 排序过程 设置一个和原数

6、组data 同类型,同规模的数组d,并将其视为循环数组(即位置n-1和0逻辑上相邻) d0 = data0,将d0看作为排好序中处于中间位置的元素,从第二个元素data1开始做以下操作 如果dataid0,将datai插入d0之后的有序序列,并保持插入后有序;反之,将其插入d0之前的有序序列,并保持插入后有序,2-路插入排序例,7.1.4 希尔排序,希尔排序(又称缩小增量排序) 将记录序列分成若干子序列,分别对每个子序列进行直接插入排序。 例如:将 n 个记录分成 d 个子序列: R1,R1+d,R1+2d,R1+kd R2,R2+d,R2+2d,R2+kd Rd,R2d,R3d,Rkd,R(

7、k+1)d 其中,d 称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为 1。,希尔排序例,设增量d=5,设增量d=3,设增量d=1,7.1.4 希尔排序,希尔排序算法,template void ShellSort(ElemType data, int increments, int n, int incrementsLength)int i, j, k;ElemType tmp; for ( k = 0; k = incrementsk; j -= incrementsk)if ( tmp = dataj - incrementsk)break; dataj = dataj

8、 - incrementsk; dataj = tmp; ,7.1.4 希尔排序,特点 子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的元素组成一个子序列。 希尔排序可提高排序速度,因为 分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体上看是减小了。 关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序。,7.1.4 希尔排序,算法评价 算法效率依赖于增量序列的选择 时间复杂度 在O(n3/2)到O(n7/6)之间 增量序列的取法 最后一个增量必须为1 其他增量间保持“互质”,7.2 分划类排序,分划类排序 通过一趟划分确定一个元素在序列中的位

9、置,保证在它之前的一组元素不比它大,之后的不比它小,接着对两组元素继续分划,直至待排序列有序。 应用分划类排序思想的算法 冒泡排序 快速排序,7.2.1 冒泡排序,排序过程 将第一个和第二个元素的关键字进行比较,若为逆序,则将两个元素互换;接着比较第二个和第三个元素的关键字,依次类推,直至最后两个元素的完成比较,这称为第一趟冒泡排序。第一趟排序分划出一组元素个数为n-1的待排序列和一个关键字最大的元素。 第i趟对前n - i + 1个的元素进行类似的排序操作,得到一组元素个数为n - i的待排序列和一个(在前n-i+1个元素中)关键字最大的元素。 这样不断分划直至一趟分划时无元素互换为止。,7

10、.2.1 冒泡排序,假设在排序过程中,元素序列A0n-1的状态为:,无序序列A0n-i,有序序列 An-i+1n-1,n-i,无序序列A0n-i-1,有序序列 An-in-1,比较相邻记录,将关键字最大的记录交换到 n-i 的位置上,第 i 趟冒泡排序,冒泡排序例,7.2.1 冒泡排序,冒泡排序算法,template void BubbleSort(ElemType data, int n) int lastSwapIndex = n - 1; /用于记录最后一次交换的元素下标int i, j;for (i = lastSwapIndex; i 0;i = lastSwapIndex) las

11、tSwapIndex = 0; for (j = 0; j dataj + 1)Swap(dataj,dataj + 1);lastSwapIndex = j; ,7.2.1 冒泡排序,算法评价 最好情况(正序) 比较次数:n-1 移动次数:0 最坏情况(逆序) 比较次数:n(n-1)/2 移动次数:3n(n-1)/2 平均T(n) = O(n2),7.2.2 快速排序,一趟快速排序 选第一个待排序元素作为枢轴(或支点pivot),根据枢轴将待排序列划分为两个子序列。 这两个子序列必须满足以下条件:一个子序列的元素关键字都不大于枢轴的关键字,另一个子序列的元素关键字都不小于枢轴的关键字。,7.

12、2.2 快速排序,首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。,无 序 的 元 素 序 列,无序子序列(1),无序子序列(2),枢轴,一次划分,分别进行快速排序,7.2.2 快速排序,排序过程 对待排序列A进行快速排序的递归算法QuickSort(A)可以描述如下: 如果A中元素的个数为0或1,则返回;否则,继续 选取A中的一个元素p作为枢轴(pivot) 将A中剩下的元素“划分”成两个不相交的集合:QuickSort (A1),QuickSort (A2),一趟快速排序例,7.2.2 快速排序,/ 对datalow.high进行分划,确定枢轴的位置

13、,并返回其所在位置 / 子序列中,在枢轴之前(后)的元素均不大(小)于它 template int Partition(ElemType data , int low , int high) ElemType pivot = datalow; / 用子序列的头元素作为枢轴 while (low = pivot) high-; datalow = datahigh; / 比枢轴小的元素移到低端while (low = datalow) low+; datahigh = datalow; / 比枢轴大的元素移到高端 datalow = pivot; / 确定枢轴的合适位置return low; /

14、 返回枢轴的位置 ,一趟快速排序算法,7.2.2 快速排序,快速排序算法,/ 对databegin.end进行快速排序 template void QuickSort(ElemType data, int begin, int end) if (begin = end) / data长度小于等于1时返回return;int pivot = Partition(data , begin , end); / 对databegin.end进行分划QuickSort(data , begin , pivot - 1); / 对低端子列进行递归排序QuickSort(data , pivot + 1,

15、end); / 对高端子列进行递归排序 / 快速排序 template void QuickSort(ElemType data, int n)if (n 2)return;QuickSort(data, 0, n-1); ,7.2.2 快速排序,算法分析 最好情况 每次中间值作为枢轴 T(n)=O(nlog2n) 最坏情况 每次总是最大或最小元素作为枢轴 T(n)=O(n) 平均情况 T(n)= O(nlogn) 三数中值分割法,7.3 选择类排序,选择类排序 逐趟扫描未排序的部分,从中选取一个元素移动到合适的位置 。 应用选择类排序思想的算法 简单选择排序 树形选择排序 堆排序,7.3.1

16、 简单选择排序,假设排序过程中,待排记录序列的状态为:,有序序列A0i-2,无序序列 Ai-1n-1,第 i 趟简单选择排序,从中选出关键字最小的元素,有序序列A0i-1,无序序列 Ain-1,7.3.1 简单选择排序,排序过程 第一趟扫描所有待排序元素,找出关键字最小的元素并将它与第一个元素进行交换; 第i趟,扫描待排序列中剩余n - i +1个元素,找出关键字最小的元素与序列中第i个元素交换; 重复上述操作,直到所有的元素都放到正确的位置上为止。,简单选择排序例,简单选择排序算法,7.3.1 简单选择排序,template void SelectionSort(ElemType data,

17、 int n) int i, j, min;for (i = 0; i n-1; i+)min = i;for (j = i + 1; j n; j+) / 选择datai+1.n-1中最小的元素if (dataj datamin)min = j; if (i!=min)Swap(datai,datamin); / 将datai与第i小的元素交换 ,7.3.1 简单选择排序,算法分析 最好情况 比较次数: 移动次数:0 最坏情况 比较次数: 移动次数: 3(n - 1) 平均T(n)=O(n),7.3.2 树形选择排序,简单选择排序中一趟排序中的比较操作可能在前一趟中已经做过,但前一趟中未保存

18、这些比较结果,因此在后一趟的排序中又重复执行了这些操作。为了解决这个问题,树形选择排序应运而生。 树形选择排序(又称锦标赛排序)算法思想 先将n个元素的关键字两两比较,然后将其中较小者两两比较,如此重复,不断的淘汰较大者,最终选出关键字最小的元素。,树形选择排序例,例如:,显然,比简单选择排序的比较次数少,但它需要增加辅助空间。,7.3.3 堆排序,堆的定义:堆是满足下列性质的数列a1, a2, ,an:,或,(小顶/根堆),(大顶/根堆),12, 36, 27, 65, 40, 34, 98, 81, 73, 55, 49 小顶堆,12, 36, 27, 65, 40, 14, 98, 81

19、, 73, 55, 49 不是堆,7.3.3 堆排序,若将该数列视作完全二叉树,则 r2i 是 ri 的左孩子; r2i+1 是 ri 的右孩子。,ai,a2i,a2i+1,12,36,27,65,49,81,73,55,40,34,98,不是堆,14,是小顶堆,序列12, 36, 27, 65, 40, 34, 98, 81, 73, 55, 49,14,7.3.3 堆排序,堆排序即是利用堆的特性对记录序列进行排序的一种方法。,建大顶堆,98, 53, 55, 18, 4, 22, 24,24, 53, 55, 18, 4, 22, 98,交换 98 和 24,重新调整为大顶堆,55, 53

20、, 24, 18, 4, 22, 98 ,22, 18, 53, 98, 4, 24, 55,经过筛选,7.3.3 堆排序,排序过程 将待排序列A0n-1建成大顶堆; 将堆顶元素A0(即关键字最大的元素)与堆尾元素(即堆中最后一个元素)交换,从堆中除去堆尾元素(即关键字最大的元素),同时调整堆中剩余元素,使它们恢复堆属性; 反复进行步骤2,直至堆中元素个数为1。,7.3.3 堆排序,堆排序需解决的两个问题: 如何将初始的待排序列建成一个堆? 因堆顶元素与堆尾元素交换后,新的堆顶元素可能破坏了堆属性,如何再调整成为堆? 第二个问题解决方法(大顶堆) 输出堆顶元素之后,以堆中最后一个元素替代之;选

21、左、右孩子中值大者(child)与根结点值比较,若child的值大于根的值,则进行交换;接着,以下调的结点为根,重复上述操作,直至根结点的值不小于孩子的值或根为叶子结点,即得到新的堆。称这个调整过程为“筛选”。,例,堆排序调整例,堆排序调整例,7.3.3 堆排序,第一个问题解决方法 从最后一个非叶子结点(即第 n/2个元素)开始依次往前,对所有非叶子结点做调整操作。,建堆例,建堆是一个从下往上进行“筛选”的过程。,40,55,49,73,64,81,36,12,27,98,例如: 排序之前的关键字序列为,12,36,81,73,49,98,98,49,40,27, 40, 55, 49, 73

22、, 12, 27, 98, 81, 64, 36 ,64,81,73,55,36,12,64,调整堆算法,7.3.3堆排序,/ 将datain-1中的元素调整为大顶堆 template void HeapAdjust(ElemType data, int i, int n) ElemType tmp;int child; for ( tmp = datai; LeftChild(i) datachild) / 取较大的孩子结点child+;if (tmp datachild) datai = datachild;elsebreak;datai = tmp; ,7.3.3 堆排序,堆排序算法,/

23、 堆排序 template void HeapSort(ElemType data, int n) int i;for (i = n/2; i = 0; i-) / 建堆HeapAdjust(data, i, n);/ 将堆的根结点与最后的一个叶结点交换,并进行调整for (i = n - 1;i 0; i-) Swap(data0,datai);HeapAdjust(data, 0, i); ,7.3.3 堆排序,算法评价 最坏情况:O(nlogn) 平均: O(nlogn),7.4 归并类排序,归并 将两个有序列合并成为一个新的有序列。 2-路归并排序 将相邻的元素两两归并,得到 一个长度

24、为2或1的有序子序列,再将这些子序列两两归并,如此重复,直至得到一个长度为n的有序列为止。,2-路归并排序例,“归并”算法,/ 将数组data中,lptr.rptr-1rptr.rightEnd两部分的元素进行合并 / tmpArr为合并时的辅存空间 template void Merge(ElemType data, ElemType tmpArr, int lptr, int rptr, int rightEnd)int leftEnd = rptr - 1;int ptr,i;ptr = i = lptr; while (lptr = leftEnd ,2-路归并排序算法,templat

25、e void MPass(ElemType data, ElemType tmpArr, int n,int mergeLength)/对n个元素的序列,以长度mergeLength两两归并int i = 0; while (i = n - 2 * mergeLength)/两个序列均有mergelength个元素Merge(data, tmpArr, i, i+mergeLength,i+2*mergeLength-1);i = i + 2 * mergeLength;if (i + mergeLength n)/后一个序列不足mergeLength个元素Merge(data, tmpArr

26、, i, i + mergeLength, n - 1); ,2-路归并排序算法,/ 2-路归并算法非递归实现 template void MergeSortNonRecursion(ElemType data, int n)int mergeLength = 1; / mergeLength记录每趟归并的步长ElemType* pArr = NULL;pArr = new ElemTypen; / pArr为合并时的辅存空间 while (mergeLength n)MPass(data, pArr, n, mergeLength);mergeLength *= 2;delete pArr;

27、 ,7.4 归并类排序,算法评价 T(n)= O(nlogn) 缺点 空间复杂度为O(n) 算法中需要较多的拷贝工作,7.5 基数排序,无须比较关键字 通过“分配”和“收集”两个过程来完成排序任务 借助“多关键字排序”的思想,7.5.1 多关键字的排序,假设待排序列 a1, a2, an中每个元素ai有d个关键字 ,该序列对关键字 有序是指:对序列中任意两个元素ai和aj(1 i j n)都满足下列有序关系:当两个元素的所有关键字都相等时,则必须保持其稳定性。其中 称为最主位关键字, 称为最次位关键字。,7.5.1 多关键字的排序,排序方法 最高位优先法(MSD) 先对最高位关键字k1排序,将

28、序列分成若干子序列,每个子序列有相同的k1值; 接着让每个子序列对次关键字k2排序,又分成若干更小的子序列; 依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列。 最低位优先法(LSD) 从最低位关键字kd起进行排序,然后再对高一位的关键字排序,依次重复,直至对最高位关键字k1排序后,便成为一个有序序列。,7.5.1 多关键字的排序,MSD与LSD不同特点 按MSD排序,必须将序列逐层分割成若干子序列,然后对各子序列分别排序。 按LSD排序,不必分成子序列,对每个关键字都是整个序列参加排序;并且可不通过关键字比较,而通过若干次分配与收集实现排序。,

29、最高/低位优先法例,例如:对扑克牌排序。,最高位优先法: 先按花色将牌分成4堆,花色相同的放在一起; 再对每一堆按面值排列成有序序列; 最后,按花色将各堆有序序列排列成整付牌的有序序列。,最低位优先法: 先按面值将牌分成13堆,面值相同的放在一起; 按面值由小到大把整付牌收回来; 再按花色将牌分成4堆(从下面开始拿),花色相同的放在一起; 最后,按花色将各堆排列成整付牌的有序序列。,7.5.2 基数排序,无序序列,对K2排序,对K1排序,对K0排序,3,2,30,1,2,15,3,1,20,2,3,18,2,1,20,1,2,15,2,3,18,3,1,20,2,1,20,3,2,30,3,1

30、,20,2,1,20,1,2,15,3,2,30,2,3,18,1,2,15,2,1,20,2,3,18,3,1,20,3,2,30,LSD的排序过程如下:,例如:学生记录含三个关键字: 系号、班号和班内序列号,其中以系号为最主位关键字。,7.5.2 基数排序,基数排序就是借助多关键字的最低位优先法对单关键字排序的方法。 在单关键字排序中,一个关键字可以看作由若干个关键字分量复合而成,如整数可视为若干数位的集合。,链式基数排序例,首先按其“个位数”取值分别为 0, 1, , 9“分配”成10组,之后按从0至9的顺序将它们“收集”在一起;,然后按其“十位数”取值分别为 0, 1, , 9 “分配

31、”成10组,之后再按从 0 至 9 的顺序将它们 “收集” 在一起;,最后按其“百位数”重复一遍上述操作。,例如:对下列这组关键字 209, 386, 768, 185, 247, 606, 230, 834, 539 ,链式基数排序例,待排序记录以指针相链,构成一个链表;,. “分配”时,按当前“关键字位”所取值,将记录分配到不同的“链队列”中,每个队列中记录的“关键字位”相同;,“收集”时,按当前关键字位取值从小到大将各队列首尾相链成一个链表;,对每个关键字位均重复 2) 和 3) 两步。,链式基数排序例,p369367167239237138230139,进行第一次分配,进行第一次收集,

32、r0f0,r7f7,r8f8,p230,230, 367,167,237 ,367167237,138,368239139, 369,239,139, 138,例如:,r1f1,r2f2,r3f3,r4 f4,r5f5,r6f6,r9f9,链式基数排序例,进行第二次分配,p230237138239139,p230367167237138368239139,230,237,138,239,139, 367 ,167,368,367167368,进行第二次收集,r0f0,r7f7,r8f8,r1f1,r2f2,r3f3,r4 f4,r5f5,r6f6,r9f9,链式基数排序例,r6f6,r3f3,

33、进行第三次收集之后便得到记录的有序序列,p230237138239139367167368,进行第三次分配,p138139167,230237239,367368,r0f0,r7f7,r8f8,r1f1,r2f2,r4 f4,r5f5,r9f9, 138,139,167, 230,237,239,367,368,静态链表,class SLList struct Node int keyDIGITS;int info;int next; ; friend ostream,7.5.2 基数排序,void SLList:Distribute(int front, int rear, int digi

34、t) int i, index;for (i = 0; i 0; i = L.datai.next)index = datai.key / (int)pow(10.0, digit) - datai.key / (int)pow(10.0, digit + 1) * 10;if (frontindex = 0)frontindex = i;elsedatarearindex.next = i;rearindex = i; ,链式基数排序 “分配”算法,链式基数排序 “收集”算法,7.5.2 基数排序,void SLList:Collection(int front, int rear, int

35、 digit) int i, current;for (i = 0; fronti = 0; i+); /找到第一个非空子表data0.next = fronti; /头结点指向第一个非空子表中第一个结点current = reari+;for (; i RADIX; i+)if (fronti = 0)continue;datacurrent.next = fronti; /链接两个非空子表current = reari;datacurrent.next = 0; ,链式基数排序 算法,7.5.2 基数排序,/ 用SLList实现的基数排序 void SLList:RadixSort() i

36、nt i;int frontRADIX,rearRADIX;/ 从最低位优先依次对各关键字进行分配收集for ( i = 0; i DIGITS; i+)Distribute(front, rear, i);Collection(front, rear, i); ,7.5.2 基数排序,重排 链式基数排序产生的是一个有序循环链表,只能对它进行顺序访问,无法进行随机访问,因此有时需要对元素重新排列,将元素按照链表结点中next域的值调整位置使其顺序存储。 具体做法 顺序扫描有序链表,将链表中第i个结点移动至静态链表中的第i个分量。,重排例,重排算法,7.5.2 基数排序,void SLList:

37、Arrange() int i, tmp;int current = data0.next; / current存放第一个元素的当前位置for (i = 1; i length; i+)while (current i) / 找到第i个元素,并用current存放其在静态/ 链表中当前位置current = datacurrent.next;tmp = datacurrent.next;if (current != i)Swap(datacurrent, datai); / 第i个元素调整到位datai.next = current; / 指向被移走的元素current = tmp; / 为找

38、第i + 1个元素做准备 ,7.5.2 基数排序,算法分析 空间复杂度 O(r) 时间复杂度T(n)= O(d (n + r)其中,n为待排序元素个数,d为元素的关键字分量数,r为基数,7.6 内部排序的比较,7.6 内部排序的比较,从平均性能而言,快速排序最佳,但最坏情况下不如堆排序和归并排序。 直接插入排序、简单选择排序、冒泡排序是O(n2)的排序,不适合处理n较大的情况。 从空间复杂度角度考虑 归并排序需要与待排序列等量的辅助存储空间,其空间复杂度为O(n); 基数排序次之,空间复杂度为O(r); 快速排序最坏情况下需要的栈空间为O(n),最好情况下需要的栈空间为O(logn); 其余排

39、序算法的空间复杂度为O(1),7.6 内部排序的比较,从稳定性角度考虑 直接插入排序、冒泡排序、归并排序和基数排序都是稳定的。 堆排序、快速排序、希尔排序和简单选择排序是不稳定的。,7.6 内部排序的比较,选择排序方法时应综合考虑以下因素 待排序的元素数目n 关键字的结构及其初始状态 对稳定性的要求 语言工具的条件 存储结构 时间和辅助空间复杂度等,7.6内部排序的比较,排序的一般下界 任何借助“比较”的排序算法可能达到的最快的平均时间复杂度为O(nlogn)。,7.7 外部排序,外部排序是指大文件的排序,用于处理输入数据量较大、无法同时全部载入内存的排序情况,7.7.1外部存储设备,根据外存

40、设备的存储介质分类 磁盘文件 直接存取设备 磁带文件 顺序存取设备,7.7.1外部存储设备,磁盘存储器 由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等部分组成 磁盘上标明一个具体位置需要用一个三维地址:柱面号、盘面号、块号 磁盘读写一块数据的时间需要由3部分组成:寻道时间、等待时间和传输时间 磁带存储器 一种以磁带为存储介质、能存储大量数字信息的装置 通常由磁带控制器和磁带驱动器(或称磁带机)组成 在磁带上读写一块数据需要的时间由两部分组成:延迟时间和传输时间,7.7.2 外部排序的方法,外部排序以下两个阶段组成 生成初始归并段根据可用内存大小,将n个待排序元素的文件分

41、成若干个子文件,依次读入内存并利用内部排序算法对它们进行排序,然后将排序后得到的子文件写入外存,这些有序的子文件或排过序的元素组称为归并段或顺串。 归并将这些归并段逐趟归并,归并段逐渐由小到大,直至得到整个有序文件为止。,7.7.2 外部排序的方法,外部排序需要的总时间 = 内部排序所需的时间(mtIS) + 外存信息读写的时间(dtIO) + 内部归并所需的时间(sutmg)其中,m为初始归并段个数,tIS是得到一个初始归并段所耗费的内部排序时间的均值;d为总的外存读/写次数,tIO为一次读/写时间的均值;s为归并的趟数,utmg是对u个元素进行内部归并所需的时间若增加k或减少归并段个数m便

42、能减少s,从而减小外存读写次数d,但单纯增加k将使utmg增加,7.7.3 败者树,败者树是指在锦标赛(选择树)中,每个父结点存放其孩子结点中的“败者”,而让“胜者”参加更高一层的比赛,而在根结点之上再增加一个结点,存放整个比赛的获胜者,败者树例,7.7.3 败者树,置换-选择排序 采用败者树来生成初始归并段 最佳归并树 对长度不等的m个初始归并段构造一颗哈夫曼树作为归并树,则可以保证在外部归并时所需要的外存读写次数达到最小,这棵归并树被称为最佳归并树,7.8 学习要点,熟练掌握各内部排序算法的基本思想、具体过程以及实现算法;掌握各种排序算法时间复杂度、空间复杂度的分析方法和稳定性的含义。 排序算法大致可分为5类:插入类排序、分划类排序、选择类排序、归并类排序和基数排序。 通过对各种典型的排序算法的学习,能够在实际问题上选择或设计适合的排序算法。,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报