排序算法思想

上传人:pu****.1 文档编号:568657436 上传时间:2024-07-25 格式:PPT 页数:54 大小:1,023.50KB
返回 下载 相关 举报
排序算法思想_第1页
第1页 / 共54页
排序算法思想_第2页
第2页 / 共54页
排序算法思想_第3页
第3页 / 共54页
排序算法思想_第4页
第4页 / 共54页
排序算法思想_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《排序算法思想》由会员分享,可在线阅读,更多相关《排序算法思想(54页珍藏版)》请在金锄头文库上搜索。

1、第第9章章 排序排序要求:要求:l本本章章要要理理解解各各种种排排序序算算法法的的思思想想(层层次次1)、稳定性和时空性能;稳定性和时空性能;l插插入入排排序序:直直接接插插入入排排序序、折折半半插插入入排排序序、*希尔排序;希尔排序;l交交换换排排序序:冒冒泡泡、快快速速排排序序;快快速速排排序序算算法法要要求灵活应用(算法层次求灵活应用(算法层次3););l选选择择排排序序:直直接接选选择择排排序序、堆堆排排序序(堆堆概概念念,筛选、建堆、堆排序);筛选、建堆、堆排序);l归并排序:归并排序:2-路归并排序路归并排序1第第9章章 排序排序l排序定义排序定义将一个数据元素(或记录)的任意将一

2、个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫序列,重新排列成一个按关键字有序的序列叫l排序分类排序分类l按待排序记录所在位置按待排序记录所在位置l内部排序:待排序记录存放在内存内部排序:待排序记录存放在内存l外部排序:排序过程中需对外存进行访问的排序外部排序:排序过程中需对外存进行访问的排序l按排序依据原则按排序依据原则l插入排序:直接插入排序、折半插入排序、插入排序:直接插入排序、折半插入排序、 *希尔排序希尔排序l交换排序:冒泡排序、快速排序交换排序:冒泡排序、快速排序l选择排序:简单选择排序、堆排序选择排序:简单选择排序、堆排序l归并排序:归并排序:2-路归并排序路

3、归并排序l*基数排序基数排序2l按排序所需工作量按排序所需工作量l简单的排序方法:简单的排序方法:T(n)=O(n)l先进的排序方法:先进的排序方法:T(n)=O(logn)l*基数排序:基数排序:T(n)=O(d.n)l排序基本操作排序基本操作l比较两个关键字大小比较两个关键字大小l将记录从一个位置移动到另一个位置将记录从一个位置移动到另一个位置3当待排序记录的关键字均不相同时,排序结果是惟一当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一。的,否则排序结果不唯一。在待排序的文件中,若存在多个关键字相同的记录,在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具

4、有相同关键字的记录之间的经过排序后这些具有相同关键字的记录之间的相对次序保持相对次序保持不变不变,该排序方法是,该排序方法是稳定稳定的;若具有相同关键字的记录之间的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。的相对次序发生变化,则称这种排序方法是不稳定的。注意:注意:排序算法的稳定性是针对所有输入实例而言的。即在排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。定性要求,则该排序算法就是不稳定的。排序的稳定性49.1 插入排序l

5、直接插入排序直接插入排序l排序过程:整个排序过程为排序过程:整个排序过程为n-1趟插入,即先将序列趟插入,即先将序列中第中第1个记录看成是一个有序子序列,然后从第个记录看成是一个有序子序列,然后从第2个个记录开始,逐个进行插入,直至整个序列有序记录开始,逐个进行插入,直至整个序列有序5例49 38 65 97 76 13 27i=2 38 (38 49) 65 97 76 13 27i=3 65 (38 49 65) 97 76 13 27i=4 97 (38 49 65 97) 76 13 27i=5 76 (38 49 65 76 97) 13 27i=6 13 (13 38 49 65

6、76 97) 27i=1 ( )i=7 (13 38 49 65 76 97) 2727jjjjjj977665493827 (13 27 38 49 65 76 97)排序结果:l算法描述 算法10.1 P2656void InsertSort(SqList &L) / 算法10.1 / 对顺序表L作直接插入排序。 for (i=2; i=L.length; +i) if (LT(L.ri.key, L.ri-1.key) / 时,需将L.ri插入有序子表 L.r0 = L.ri; / 复制为哨兵 for (j=i-1; LT(L.r0.key, L.rj.key); -j) L.rj+1

7、= L.rj; / 记录后移 L.rj+1 = L.r0; / 插入到正确位置 / InsertSort7l算法评价l时间复杂度l若待排序记录按关键字从小到大排列(正序)Y关键字比较次数:Y记录移动次数:l若待排序记录按关键字从大到小排列(逆序)Y关键字比较次数:Y记录移动次数:l若待排序记录是随机的,取平均值Y关键字比较次数:Y记录移动次数:T(n)=O(n)l空间复杂度:S(n)=O(1)8l折半插入排序折半插入排序l排序过程:用折半查找方法确定插入位置的排序叫排序过程:用折半查找方法确定插入位置的排序叫例i=1 (30) 13 70 85 39 42 6 20i=2 13 (13 30)

8、 70 85 39 42 6 20i=7 6 (6 13 30 39 42 70 85 ) 20.i=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sji=8 20 (6 13 20 30 39 42 70 85 )9算法描述算法描述 算法算法10.2 P267void BInsertSort(SqList &L) / 对顺序表对顺序表L作折半插入排序。作折半插入排序。 f

9、or (i=2; i=L.length; +i) L.r0 = L.ri; / 将将L.ri暂存到暂存到L.r0 low = 1; high = i-1; while (low=high+1; -j) L.rj+1 = L.rj; / 记录后移记录后移 L.rhigh+1 = L.r0; / 插入插入 / BInsertSortl算法评价l时间复杂度:T(n)=O(n)l空间复杂度:S(n)=O(1)10l*希尔排序希尔排序(缩小增量法缩小增量法)l排序过程:先取一个正整数排序过程:先取一个正整数d1n,把所有相隔把所有相隔d1的记的记录放一组,组内进行直接插入排序;然后取录放一组,组内进行直

10、接插入排序;然后取d2r2.key,则交换;则交换;然后比较第二个记录与第三个记录;依次类推,然后比较第二个记录与第三个记录;依次类推,直至第直至第n-1个记录和第个记录和第n个记录比较为止个记录比较为止第一第一趟冒泡排序趟冒泡排序,结果关键字最大的记录被安置在最,结果关键字最大的记录被安置在最后一个记录上后一个记录上l对前对前n-1个记录进行第二趟冒泡排序,结果使关个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第键字次大的记录被安置在第n-1个记录位置个记录位置l重复上述过程,直到重复上述过程,直到“在一趟排序过程中没有进在一趟排序过程中没有进行过交换记录的操作行过交换记录的操作”

11、为止为止15例49 38 65 97 76 13 27 30初始关键字38 49 65 76 13 27 30 97第一趟38 49 65 13 27 30 76第二趟38 49 13 27 30 65第三趟38 13 27 30 49第四趟13 27 30 38第五趟13 27 30第六趟3849769713972797309713767676273013652765306513134949304927382738303816l算法描述算法描述 C语言语言l算法评价l时间复杂度l最好情况(正序)Y比较次数:n-1Y移动次数:0l最坏情况(逆序)Y比较次数:Y移动次数:l空间复杂度:S(n)=

12、O(1)T(n)=O(n)17l快速排序快速排序l基本思想:通过一趟排序,将待排序记录分割成独立的基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序整个序列有序l排序过程:对排序过程:对rst中记录进行一趟快速排序,附设中记录进行一趟快速排序,附设两个指针两个指针i和和j,设枢轴记录设枢轴记录rp=rs,x=rp.keyT. Hoare partitionl初始时令初始时令i=s,j=tl首先从

13、首先从j所指位置向前搜索第一个关键字小于所指位置向前搜索第一个关键字小于x的记录,并和的记录,并和rp交交换换l再从再从i所指位置起向后搜索,找到第一个关键字大于所指位置起向后搜索,找到第一个关键字大于x的记录,和的记录,和rp交换交换l重复上述两步,直至重复上述两步,直至i=j为止为止l再分别对两个子序列进行快速排序,直到每个子序列只含有一个再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止记录为止18例例初始关键字:初始关键字: 49 38 65 97 76 13 27 50 ijxji 完成一趟排序:完成一趟排序: ( 27 38 13) 49 (76 97 65 50)

14、分别进行快速排序:分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97) 快速排序结束:快速排序结束: 13 27 38 49 50 65 76 974927ijijij4965ji1349ij4997ij19int Partition(SqList &L, int low, int high) / 算法10.6(a) / 交换顺序表L中子序列L.rlow.high的记录,使枢轴记录到位, / 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它 KeyType pivotkey; RedType temp; pivotkey = L.rlow.key;

15、/ 用子表的第一个记录作枢轴记录 while (lowhigh) / 从表的两端交替地向中间扫描 while (low=pivotkey) -high; temp=L.rlow; L.rlow=L.rhigh; L.rhigh=temp; / 将比枢轴记录小的记录交换到低端 while (lowhigh & L.rlow.key=pivotkey) +low; temp=L.rlow; L.rlow=L.rhigh; L.rhigh=temp; / 将比枢轴记录大的记录交换到高端 return low; / 返回枢轴所在位置 / Partition20int Partition(SqList

16、&L, int low, int high) / 算法10.6(b) / 交换顺序表L中子序列L.rlow.high的记录,使枢轴记录到位, / 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它 KeyType pivotkey; L.r0 = L.rlow; / 用子表的第一个记录作枢轴记录 pivotkey = L.rlow.key; / 枢轴记录关键字 while (lowhigh) / 从表的两端交替地向中间扫描 while (low=pivotkey) -high; L.rlow = L.rhigh; / 将比枢轴记录小的记录移到低端 while (lowhigh & L

17、.rlow.key=pivotkey) +low; L.rhigh = L.rlow; / 将比枢轴记录大的记录移到高端 L.rlow = L.r0; / 枢轴记录到位 return low; / 返回枢轴位置 / Partition21void QSort(SqList &L, int low, int high) /算法10.7 / 对顺序表L中的子序列L.rlow.high进行快速排序 int pivotloc; if (low high) / 长度大于1 pivotloc = Partition(L, low, high); / 将L.rlow.high一分为二 QSort(L, lo

18、w, pivotloc-1); / 对低子表递归排序,pivotloc是枢轴位置 QSort(L, pivotloc+1, high); / 对高子表递归排序 / Qsortvoid QuickSort(SqList &L) / 算法10.8 / 对顺序表L进行快速排序 QSort(L, 1, L.length); / QuickSort22l算法评价算法评价l时间复杂度时间复杂度l最好情况(每次总是选到中间值作枢轴)最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)l最坏情况(每次总是选到最小或最大元素作枢最坏情况(每次总是选到最小或最大元素作枢轴)轴)T(n)=O(n)l空间

19、复杂度:需栈空间以实现递归空间复杂度:需栈空间以实现递归l最坏情况:最坏情况:S(n)=O(n)l一般情况:一般情况:S(n)=O(log2n)T(n)=O(n)239.3 选择排序l简单选择排序简单选择排序l排序过程排序过程l首先通过首先通过n-1次关键字比较,从次关键字比较,从n个记录中找个记录中找出关键字最小的记录,将它与第一个记录交出关键字最小的记录,将它与第一个记录交换换l再通过再通过n-2次比较,从剩余的次比较,从剩余的n-1个记录中找个记录中找出关键字次小的记录,将它与第二个记录交出关键字次小的记录,将它与第二个记录交换换l重复上述操作,共进行重复上述操作,共进行n-1趟排序后,

20、排序趟排序后,排序结束结束24例初始: 49 38 65 97 76 13 27 kjjjjjjkki=11349一趟: 13 38 65 97 76 49 27 i=2kkjjjjj2738二趟: 13 27 65 97 76 49 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 49 65 76 97 排序结束: 13 27 38 49 65 76 9725void SelectSort(SqList &L) / 算法10.9 / 对顺序表L作简单选择排序。

21、 for (i=1; iL.length; +i) / 选择第i小的记录,并交换到位 j = SelectMinKey(L, i); / 在L.ri.L.length中选择key最小的记录 if (i!=j) L.riL.rj; /与第i个记录交换 / SelectSort26l算法评价算法评价l时间复杂度时间复杂度l记录移动次数记录移动次数Y最好情况:最好情况:0Y最坏情况:最坏情况:3(n-1)l比较次数:比较次数:l空间复杂度:空间复杂度:S(n)=O(1)T(n)=O(n)27l堆排序堆排序l堆的定义:堆的定义:n个元素的序列个元素的序列(k1,k2,kn),当且仅当当且仅当满足下列关

22、系时,称之为堆满足下列关系时,称之为堆或或(i=1,2,. n/2 )ki k2iki k2i+1ki k2iki k2i+1例例 (96,83,27,38,11,9)例例 (13,38,27,50,76,65,49,97)962791138831327384965765097可将堆序列看成完全二叉树,则堆顶可将堆序列看成完全二叉树,则堆顶元素(完全二叉树的根)必为序列中元素(完全二叉树的根)必为序列中n个元素的最小值或最大值个元素的最小值或最大值28l堆排序:将无序序列建成一个堆,得到关键堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小字最小(或最大)的记录;输出

23、堆顶的最小(大)值后,使剩余的(大)值后,使剩余的n-1个元素重又建成一个元素重又建成一个堆,则可得到个堆,则可得到n个元素的次小值;重复执行,个元素的次小值;重复执行,得到一个有序序列,这个过程叫得到一个有序序列,这个过程叫l堆排序需解决的两个问题:堆排序需解决的两个问题:l如何由一个无序序列建成一个堆?如何由一个无序序列建成一个堆?l如何在输出堆顶元素之后,调整剩余元素,使之如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?成为一个新的堆?l第二个问题解决方法第二个问题解决方法筛选筛选l方法:输出堆顶元素之后,以堆中最后一个元素方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后

24、将根结点值与左、右子树的根结点替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为堆顶至叶子的调整过程为“筛选筛选”29例例13273849657650979727384965765013输出:输出:132749389765765013输出:输出:139749382765765013输出:输出:13 273849502765769713输出:输出:13 276549502738769713输出:输出:13 27 38

25、304965502738769713输出:输出:13 27 387665502738499713输出:输出:13 27 38 495065762738499713输出:输出:13 27 38 499765762738495013输出:输出:13 27 38 49 506597762738495013输出:输出:13 27 38 49 509765762738495013输出:输出:13 27 38 49 50 65317665972738495013输出:输出:13 27 38 49 50 659765762738495013输出:输出:13 27 38 49 50 65 7697657627

26、38495013输出:输出:13 27 38 49 50 65 76 9732筛选算法筛选算法10.10Type SqList HeapType;Void HeapAdjust(HeapType &H, int s, int m) /H.rs+1m 为大顶堆为大顶堆 rc = H.rs; for (j=2*s; j=m; j*=2) / / 沿沿keykey较大的孩子结点向下筛选较大的孩子结点向下筛选 if (j0; -i) /建成大顶堆建成大顶堆 HeapAdjust(H, i, H.length); for (i = H.length; i1; -i) temp = H.r1; H.r1

27、= H.ri; H.ri = temp; HeapAdjust(H, 1, i-1); /调整为大顶堆调整为大顶堆 l算法评价算法评价l时间复杂度:最坏情况下时间复杂度:最坏情况下T(n)=O(nlogn)l空间复杂度:空间复杂度:S(n)=O(1)369.4 归并排序l归并归并将两个或两个以上的有序表组将两个或两个以上的有序表组合成一个新的有序表,叫合成一个新的有序表,叫l2-路归并排序路归并排序l排序过程排序过程l设初始序列含有设初始序列含有n个记录,则可看成个记录,则可看成n个有序的子个有序的子序列,每个子序列长度为序列,每个子序列长度为1l两两合并,得到两两合并,得到 n/2 个长度为

28、个长度为2或或1的有序子序列的有序子序列l再两两合并,再两两合并,如此重复,直至得到一个长度如此重复,直至得到一个长度为为n的有序序列为止的有序序列为止37例例初始关键字:初始关键字: 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 9738算法描述算法描述 10.12Void Merge(RcdType SR. RcdType &TR, int i, int m, int n) / SRi.m和和SRm+1.

29、n分别有序分别有序, 归并到归并到TRi.n for (j = m+1, k=i; i=m & j=n; +k) if LQ(SRi.key, SRj.key) TRk = SRi+; else TRk = SRj+; / 将将SR中记录由小到大地并入中记录由小到大地并入TR if (i =m) TRk.n = SRi.m; if (j =n ) TRk.n = SRj.n;39算法算法 10.13void MSort( RcdType SR, RcdType &TR1, int s, int t) if ( s=t) TR1s = SRs; else m=(s+t)/2; /将将SRs.t平

30、分为平分为SRs.m和和SRm+1.t MSort(SR, TR2, s, m); / 递归递归 MSort(SR, TR2, m+1, t); / 递归递归 Merge(TR2, TR1, s, m, t); / 归并归并 算法算法 10.14void MergeSort(SqList &L) MSort(L.r, L.r, 1, L.length);l算法评价算法评价l时间复杂度:时间复杂度:T(n)=O(nlog2n)l空间复杂度:空间复杂度:S(n)=O(n)40简单排序中直接插入最好,快速排序最快,当文件为正简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。

31、序时,直接插入和冒泡均最佳。影响排序效果的因素影响排序效果的因素因为不同的排序方法适应不同的应用环境和要求,所以因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:选择合适的排序方法应综合考虑下列因素:待排序的记录数目待排序的记录数目n;记录的大小记录的大小(规模规模);关键字的结构及其初始状态;关键字的结构及其初始状态;对稳定性的要求;对稳定性的要求;语言工具的条件;语言工具的条件;存储结构;存储结构;时间和辅助空间复杂度等。时间和辅助空间复杂度等。各种内部排序方法的比较和选择 41不同条件下,排序方法的选择不同条件下,排序方法的选择(1)若若n较小较小(如

32、如n50),可采用直接插入或直接选择可采用直接插入或直接选择排序。排序。当记录规模较小时,直接插入排序较好;否则因当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。择排序为宜。(2)若文件初始状态基本有序若文件初始状态基本有序(指正序指正序),则应选用直,则应选用直接插人、冒泡或随机的快速排序为宜;接插人、冒泡或随机的快速排序为宜;(3)若若n较大,则应采用时间复杂度为较大,则应采用时间复杂度为O(nlgn)的排的排序方法:快速排序、堆排序或归并排序。序方法:快速排序、堆排序或归并排序。42快速排序

33、是目前基于比较的内部排序中被认为是快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。不稳定的。若要求排序稳定,则可选用归并排序。但本章若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序算法并不值介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直

34、接插入排序结合在一起使得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。改进后的归并排序仍是稳定的。43l*9.5 基数排序基数排序l多关键字排序多关键字排序l定义:定义:例 对52张扑克牌按以下次序排序:23A23A23A23A两个关键字:花色( ) 面值(23A)并且“花色”地位高于“面值”l多关键字排序方法l最高位优先法(MSD):先对最高位关键字k1(如花色)排序,将序列分成若干子

35、序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如面值)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列44l最低位优先法最低位优先法(LSD):从最低位关键字从最低位关键字kd起进行排序,然后起进行排序,然后再对高一位的关键字排序,再对高一位的关键字排序,依次重复,直至对最高位关依次重复,直至对最高位关键字键字k1排序后,便成为一个有序序列排序后,便成为一个有序序列lMSD与与LSD不同特点不同特点l按按MSD排序,必须将序列逐层分割成若干子序列,然后排序,必须将序列逐层分割成若干子序列,然后对各子

36、序列分别排序对各子序列分别排序l按按LSD排序,不必分成子序列,对每个关键字都是整个排序,不必分成子序列,对每个关键字都是整个序列参加排序;并且可不通过关键字比较,而通过若干序列参加排序;并且可不通过关键字比较,而通过若干次分配与收集实现排序次分配与收集实现排序l链式基数排序链式基数排序l基数排序:借助基数排序:借助“分配分配”和和“收集收集”对单逻辑关键字对单逻辑关键字进行排序的一种方法进行排序的一种方法l链式基数排序:用链表作存储结构的基数排序链式基数排序:用链表作存储结构的基数排序45l链式基数排序步骤链式基数排序步骤l设置设置10个队列,个队列,fi和和ei分别为第分别为第i个队列的头

37、指针和尾指针个队列的头指针和尾指针l第一趟分配对最低位关键字(个位)进行,改变记录的指针第一趟分配对最低位关键字(个位)进行,改变记录的指针值,将链表中记录分配至值,将链表中记录分配至10个链队列中,每个队列记录的关个链队列中,每个队列记录的关键字的个位相同键字的个位相同l第一趟收集是改变所有非空队列的队尾记录的指针域,令其第一趟收集是改变所有非空队列的队尾记录的指针域,令其指向下一个非空队列的队头记录,重新将指向下一个非空队列的队头记录,重新将10个队列链成一个个队列链成一个链表链表l重复上述两步,进行第二趟、第三趟分配和收集,分别对十重复上述两步,进行第二趟、第三趟分配和收集,分别对十位、

38、百位进行,最后得到一个有序序列位、百位进行,最后得到一个有序序列46例初始状态:278109063930589184505269008083109589269278063930083184505008e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9一趟分配930063083184505278008109589269一趟收集:47505008109930063269278083184589二趟收集:083184589063505269930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9二趟分配0081092789300630831

39、84505278008109589269一趟收集:48008063083109184269278505589930三趟收集:109008184930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9三趟分配063083269278505589505008109930063269278083184589二趟收集:49l算法描述l算法评价l时间复杂度:l分配:T(n)=O(n)l收集:T(n)=O(rd)T(n)=O(d(n+rd)其中:n记录数 d关键字数 rd关键字取值范围 l空间复杂度:S(n)=2rd个队列指针+n个指针域空间50初始状态:1278109063

40、93058918450526900808302345678910f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=01122334456677891049300630831845052780081095892690310671925851f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=0134477 91049300630831845052

41、7800810958926903106719258一趟收集:31016258750500810993006326927808318458909243811065二趟收集:52750500810993006326927808318458909243811065二趟收集:f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=04479287928900806308310918426927850558993003102681754三趟收集:31106553作业10.110.310.554

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

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