数据结构:第10章排序A_第1页
数据结构:第10章排序A_第2页
数据结构:第10章排序A_第3页
数据结构:第10章排序A_第4页
数据结构:第10章排序A_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 10.1 10.6 10.8 10.25 10.4210.1 10.6 10.8 10.25 10.4212周四周四截止截止2基本要求:基本要求:自编堆排序或锦标赛排序自编堆排序或锦标赛排序+折半查找算法折半查找算法高级要求:高级要求:自行设计一个方案来体现排序及查找功自行设计一个方案来体现排序及查找功能。能。写成写成“实验指导书实验指导书”的形式网上或邮件提交的形式网上或邮件提交例如:日程安排管理程序例如:日程安排管理程序 歌词搜索歌词搜索 个人理财管理个人理财管理或:种子杯复赛或决赛题或:种子杯复赛或决赛题3410.1 10.1 概述概述10.2 10.2 插入排序插入排序10.3 1

2、0.3 交换排序交换排序10.4 10.4 选择排序选择排序10.5 10.5 归并排序归并排序10.6 10.6 基数排序基数排序510.1 10.1 概述概述1. 什么是排序?什么是排序? 将一组杂乱无章的将一组杂乱无章的数据数据按一定的按一定的规律规律顺次排列起来。顺次排列起来。2. 排序的目的是什么?排序的目的是什么?存放在数据表中存放在数据表中按关键字排序按关键字排序3.3.排序算法的好坏如何衡量?排序算法的好坏如何衡量? 时间效率时间效率排序速度(即排序所花费的全部比较次数)排序速度(即排序所花费的全部比较次数) 空间效率空间效率占内存辅助空间的大小占内存辅助空间的大小 稳定性稳定

3、性若两个记录若两个记录A A和和B B的关键字值相等,但排序后的关键字值相等,但排序后A A、B B的先后次序保持不变,则称这种排序算法是稳定的。的先后次序保持不变,则称这种排序算法是稳定的。 便于查找!便于查找!64. 什么叫内部排序?什么叫外部排序什么叫内部排序?什么叫外部排序? 若待排序记录都在内存中,称为内部排序;若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存,则若待排序记录一部分在内存,一部分在外存,则称为外部排序。称为外部排序。注:注:外部排序时,要将数据分批调入内存来排序,中间外部排序时,要将数据分批调入内存来排序,中间结果还要及时放入外存,显然外部

4、排序要复杂得多。结果还要及时放入外存,显然外部排序要复杂得多。 5.5.待排序记录在内存中怎样存储和处理?待排序记录在内存中怎样存储和处理? 顺序顺序排序排序排序时直接移动记录;排序时直接移动记录; 链表链表排序排序排序时只移动指针;排序时只移动指针; 地址地址排序排序排序时先移动地址,最后再移动记录。排序时先移动地址,最后再移动记录。注:注:地址排序地址排序中可以增设一维数组来专门存放记录的地址。中可以增设一维数组来专门存放记录的地址。7注:注:大多数排序算法都是针对大多数排序算法都是针对顺序表顺序表结构的结构的( (便于直接移动元素便于直接移动元素) )6. 6. 顺序存储(顺序表)的抽象

5、数据类型如何表示?顺序存储(顺序表)的抽象数据类型如何表示?Typedef struct /定义每个记录定义每个记录(数据元素)的结构(数据元素)的结构 KeyType key ; /关键字关键字 InfoType otherinfo; /其它数据项其它数据项RecordType,node ; /例如例如node.keynode.key表示其中一个分量表示其中一个分量Typedef struct /定义顺序表定义顺序表L L的结构的结构 RecordType r MAXSIZE +1 ; /存储顺序表的向量存储顺序表的向量 /r0/r0一般作哨兵或缓冲区一般作哨兵或缓冲区 int length

6、 ; /顺序表的长度顺序表的长度SqList ,L; /例如例如L.rL.r或或L.lengthL.length表示其中一个分量表示其中一个分量# define MAXSIZE 20 /设记录数不超过设记录数不超过2020个个(本章都如此假设(本章都如此假设)typedef int KeyType ; /设关键字为整型量(设关键字为整型量(intint型)型)若若r r数组是表数组是表L L中的一个分量且为中的一个分量且为nodenode类型,类型,则则r r中某元素的中某元素的keykey分量表示为:分量表示为:ri.keyri.key87. 内部排序的算法有哪些?内部排序的算法有哪些?按排

7、序的规则不同,可分为按排序的规则不同,可分为5类:类:v插入排序插入排序v交换排序交换排序(重点是快速排序)(重点是快速排序)v选择排序选择排序v归并排序归并排序v基数排序基数排序d关键字的位数关键字的位数(长度长度)按排序算法的时间复杂度不同,可分为按排序算法的时间复杂度不同,可分为3类:类:v简单的排序算法:时间效率低,简单的排序算法:时间效率低,O(n2)v先进的排序算法先进的排序算法: 时间效率高,时间效率高,O( nlog2n )v基基 数数 排排 序序 算法:时间效率高,算法:时间效率高,O( dn)910.2 10.2 插入排序插入排序插入排序有多种具体实现算法:插入排序有多种具

8、体实现算法: 1) 直接插入排序直接插入排序 2) 折半插入排序折半插入排序 3)2-路插入排序路插入排序 4) 表插入排序表插入排序 5) 希尔排序希尔排序小改进小改进大改进大改进10新元素插入到哪里?新元素插入到哪里?例例1 1:关键字序列关键字序列T=(13,6,3,31,9,27,5,11),), 请写出直接插入排序的中间过程序列。请写出直接插入排序的中间过程序列。 【13】, 6, 3, 31, 9, 27, 5, 11【6, 13】, 3, 31, 9, 27, 5, 11【3, 6, 13】, 31, 9, 27, 5, 11【3, 6, 13,31】, 9, 27, 5, 11

9、【3, 6, 9, 13,31】, 27, 5, 11【3, 6, 9, 13,27, 31】, 5, 11【3, 5, 6, 9, 13,27, 31】, 11【3, 5, 6, 9, 11,13,27, 31】 在已形成的在已形成的有序表中有序表中线性查找线性查找,并在,并在适当位置插入,把原来位置上的元素向后适当位置插入,把原来位置上的元素向后顺移顺移。最简单的排序法!最简单的排序法!11例例1 1:关键字序列关键字序列T= (21,25,49,25*,16,08),),请写出直接插入排序的具体实现过程。请写出直接插入排序的具体实现过程。* *表示后一个表示后一个25250 1 2 3

10、4 5 6252525* * *161616080808解:解:假设该序列已存入一维数组假设该序列已存入一维数组r7r7中,将中,将r0r0作为哨兵作为哨兵(TempTemp)。则程序执行过程为:)。则程序执行过程为:初态:初态:时间效率:时间效率: 因为在最坏情况下,所有元素的比较次数总和为因为在最坏情况下,所有元素的比较次数总和为(0 01 1n-1)O(nn-1)O(n2 2) )。其他情况下也要考虑。其他情况下也要考虑移动元素的次数。移动元素的次数。 故时间复杂度为故时间复杂度为O(nO(n2 2) ) 空间效率:空间效率:仅占用仅占用1 1个缓冲单元个缓冲单元算法的稳定性:算法的稳定

11、性:因为因为2525* *排序后仍然在排序后仍然在2525的后面的后面12void InsertSort ( SqList &L ) /对顺序表对顺序表L作直接插入排序作直接插入排序 for ( i = 2; i =L.length; + i ) /直接在原始无序表直接在原始无序表L中排序中排序 if (L.ri.key L.ri-1.key) /若若L.ri较小则插入有序子表内较小则插入有序子表内 L.r0= L.ri; /先将待插入的元素放入先将待插入的元素放入“哨兵哨兵”位置位置 L.ri= L.ri-1; /子表元素开始后移子表元素开始后移 for ( j=i-2; L.r0.

12、key L.rj.key; -j ) L.rj+1= L.rj; /只要子表元素比哨兵大就不断后移只要子表元素比哨兵大就不断后移L.rj+1= L.r0; /直到子表元素小于哨兵,将哨兵值送入直到子表元素小于哨兵,将哨兵值送入 /当前要插入的位置(包括插入到表首)当前要插入的位置(包括插入到表首) /if/ InsertSort (参见教材(参见教材P265P265)13优点:优点:比较次数大大减少,全部元素比较次数仅为比较次数大大减少,全部元素比较次数仅为O O( (n nloglog2 2n)n)。时间效率:时间效率:虽然比较次数大大减少,可惜移动次数并未减少,虽然比较次数大大减少,可惜移

13、动次数并未减少, 所以排序效率仍为所以排序效率仍为O(nO(n2 2) ) 。空间效率:空间效率:仍为仍为 O O(1 1)稳稳 定定 性:性: 稳定稳定一个容易想到的改进方法:一个容易想到的改进方法: 能否减少移动次数?能否减少移动次数? 既然子表有序且为顺序存储结构,既然子表有序且为顺序存储结构,则插入时采用则插入时采用折半查找折半查找定可加速。定可加速。14这是对折半插入排序的一种改进,其目的是减少排序过这是对折半插入排序的一种改进,其目的是减少排序过程中的移动次数。程中的移动次数。代价:代价:需要增加需要增加n n个记录的辅助空间。个记录的辅助空间。思路:思路:增开辅助数组增开辅助数组

14、d, d, 大小与大小与r r相同。相同。中值中值循环向量循环向量排序中途排序中途: d= ( 49,65,76, 97 ), ( 13, 27, 38 )例:待排序列例:待排序列T=(49,38,65,97, 76, 13, 27, 49*,55, 04)finalfinalfirstfirst15讨论:讨论:若记录是若记录是链表结构链表结构,用直接插入排序行否?,用直接插入排序行否?答:答:行,而且无需移动元素,时间效率更高!行,而且无需移动元素,时间效率更高!自测卷上有对应的程序设计题。自测卷上有对应的程序设计题。161例:例:关键字序列关键字序列 T=(21,25,49,25*,16,

15、08),), 请写出表插入排序的具体实现过程。请写出表插入排序的具体实现过程。解:解:假设该序列(结构类型假设该序列(结构类型) )已存入一维数组已存入一维数组r7r7中,将中,将r0r0作为表头结点。则算法执行过程为:作为表头结点。则算法执行过程为:i 关键字关键字 ri.key ri.link0 1212253494 25*516608指向第指向第1 1个元素个元素表头结点表头结点03002* *表示后一个表示后一个2525MaxNum17int LinkInsertSort (Linklist &L) L.r0.Key = MaxNum; L.r0. Link = 1; L.r1

16、.Link = 0; /先形成首元素的小循环链表先形成首元素的小循环链表for ( int i = 2; i = L.length; i+ ) int current = L.r0. Link; /current=/current=当前元素的游标当前元素的游标 int pre = 0; while ( L.rcurrent. Key = L.ri. Key) /若若i i元素比当前元素大元素比当前元素大 pre = current; /currentcurrent后移后移, , pre“pre“保护现场保护现场”,以利,以利i i元素元素后面插后面插入入 current = L.rcurren

17、t. Link; /继续找继续找i i元素的插入位置元素的插入位置L.ri. Link = current; / / 当当i i元素元素找到合适序位时,找到合适序位时,L.rpre. Link = i; /便在便在prepre与与currentcurrent之间插入之间插入 /for /LinkInsertSort18表插入排序算法分析:表插入排序算法分析: 无需移动记录,只需修改无需移动记录,只需修改2n次指针值。但由于比较次次指针值。但由于比较次数没有减少,故数没有减少,故时间效率仍为时间效率仍为O(n2) 。 空间效率肯定低空间效率肯定低,因为增开了指针分量(但在运算过,因为增开了指针分

18、量(但在运算过程中没有用到更多的辅助单元)。程中没有用到更多的辅助单元)。 稳定性:稳定性:25和和25*排序前后次序未变,排序前后次序未变,稳定稳定。注:注:此算法得到的只是一个有序链表,查找记录时只能满此算法得到的只是一个有序链表,查找记录时只能满足顺序查找方式。足顺序查找方式。改进:改进:可以根据表中指针线索,很快对所有记录重排,形可以根据表中指针线索,很快对所有记录重排,形成成真正的有序表(顺序存储方式),从而能满足折半真正的有序表(顺序存储方式),从而能满足折半查找方式。查找方式。具体实现见教材具体实现见教材P269。19子序列的构成不是简单地子序列的构成不是简单地“逐段分割逐段分割

19、”,而是将,而是将相隔某个增量相隔某个增量dkdk的记录组成一个子序列的记录组成一个子序列, ,让增量让增量dkdk逐趟缩逐趟缩短(例如依次取短(例如依次取5,3,15,3,1),直到),直到dkdk1 1为止。为止。2038例:例:关键字序列关键字序列 T=(49,38,65,97, 76, 13, 27, 49*,55, 04),),请写出希尔排序的具体实现过程。请写出希尔排序的具体实现过程。0123456789104938659776132749*5504初态:初态:第第1趟趟 (dk=5)第第2趟趟 (dk=3)第第3趟趟 (dk=1)4913134938276549*97557604

20、2738 65 49*9755135576045513270427044949*4949*763876 65 65 9797551327044949*3876 65 9713 27 0449* 76 97 算法分析:算法分析:开始时开始时dk 的值较大,子序列中的对象较少,排序速度的值较大,子序列中的对象较少,排序速度较快;随着排序进展,较快;随着排序进展,dk 值逐渐变小,子序列中对象个数值逐渐变小,子序列中对象个数逐渐变多,由于前面工作的基础,大多数对象已基本有序,逐渐变多,由于前面工作的基础,大多数对象已基本有序,所以排序速度仍然很快。所以排序速度仍然很快。21时间效率:时间效率:空间效

21、率:空间效率:因为仅占用因为仅占用1 1个缓冲单元个缓冲单元算法的稳定性:算法的稳定性:因为因为4949* *排序后却到了排序后却到了4949的前面的前面由经验公式得到由经验公式得到练练1. 欲将序列(欲将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码)中的关键码按字母升序重排,则初始步长为按字母升序重排,则初始步长为4的希尔排序一趟的结果是?的希尔排序一趟的结果是?答:答:原始序列:原始序列: Q, H, C, Y, P, A, M, S, R, D, F, X shellshell一趟后:一趟后:课堂练习:课堂练习:P,Q,R,A,D,H,C,F,M

22、,S,X ,Y22原始序列:原始序列: 256256,301301,751751,129129,937937,863863,742742,694694,076076,438438256256,301301,751751,129129,937937,863863,742742,694694,076076,438438256256,301301,751751,129129,937937,863863,742742,694694,076076,438438256256,301301,694694,129129,937937,863863,742742,751751,076076,4384382562

23、56,301301,694694,076076,937937,863863,742742,751751,129129,438438256256,301301,694694,076076,438438,863863,742742,751751,129129,937937第第1趟趟dkdk=5=5第第2趟趟dkdk=3=3第第3趟趟dkdk=1=1256256,301301,694694,076076,438438,863863,742742,751751,129129,937937256256,301301,694694,076076,438438,863863,742742,751751,12

24、9129,937937076076,301301,694694,256256,438438,863863,742742,751751,129129,937937076076,301301,694694,256256,438438,863863,742742,751751,129129,937937076076,301301,694694,256256,438438,863863,742742,751751,129129,937937076076,301301,129129,256256,438438,694694,742742,751751,863863,937937076076,301301

25、,129129,256256,438438,694694,742742,751751,863863,937937076076,301301,129129,256256,438438,694694,742742,751751,863863,937937076076,129129,256256,301301,438438,694694,742742,751751,863863,937937练练2. 以关键字序列(以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,写出执行希尔排序()为例,写出执行希尔排序(取取dk=5, 3, 1)算)算法的法的各趟

26、各趟排序结束时,关键字序列的状态。排序结束时,关键字序列的状态。23void ShellSort(SqList &L,int dlta ,int t) /按增量序列按增量序列dlta0t-1对顺序表对顺序表L作作Shell排序排序 for(k=0;kt;+k) ShellInsert(L,dltak); / ShellSort参见教材参见教材P272P272dkdk值依次装在值依次装在dltadltat t 中中/增量为增量为dltak的一趟插入排序的一趟插入排序24理解难点:与前面的演示不同,理解难点:与前面的演示不同,并不提前处理并不提前处理i i子子集后部元素,每次只考虑子集的前

27、部(集后部元素,每次只考虑子集的前部(j=j-dkj=j-dk)第二轮也只考虑第二轮也只考虑i+1i+1那个子集的前部。那个子集的前部。 for(i=dk+1;i=L.length; + i) if(ri.key 0&(r0.key0&(r0.keyrj.key); j-=dk) rj+dk=rj;rj+dk=r0; 5 7 45 7 4 i=1 i+dk i=1 i+dk=6 i+2dk=11 =6 i+2dk=11 如果不用如果不用forfor循环,比较的结果是循环,比较的结果是 5 5,4 4,7 7 只有执行只有执行forfor循环后,比较结果才会是循环后,比较结果才会

28、是 4 4,5 5,7 7for(i=dk+1;i=L.length; + i) if(ri.key ri-dk.key) r0=ri;大者后移大者后移2610.3 10.3 交换排序交换排序交换排序的主要算法有:交换排序的主要算法有: 1) 冒泡排序冒泡排序 2) 快速排序快速排序27 1) 基本思路:基本思路:每趟不断将记录两两比较,并按每趟不断将记录两两比较,并按“前小后大前小后大”(或(或“前大后小前大后小”)规则交换。)规则交换。优点:优点:每趟结束时,不仅能挤出一个最大值到最后面位置,每趟结束时,不仅能挤出一个最大值到最后面位置,还能还能同时部分理顺其他元素同时部分理顺其他元素;一

29、旦下趟没有交换发;一旦下趟没有交换发生,还可以生,还可以提前结束排序提前结束排序。前提:前提:顺序存储结构顺序存储结构 例:例:关键字序列关键字序列 T=(21,25,49,25*,16,08),请写出),请写出冒泡排序的具体实现过程。冒泡排序的具体实现过程。21,25,49, 25*,16, 0821,25,25*,16, 08 , 4921,25, 16, 08 ,25*,4921,16, 08 ,25, 25*,4916,08 ,21, 25, 25*,4908,16, 21, 25, 25*,49初态:初态:第第1趟趟第第2趟趟第第3趟趟第第4趟趟第第5趟趟一定要附设交换标志!一定要附

30、设交换标志!28冒泡排序的算法分析冒泡排序的算法分析最好情况:最好情况:初始排列已经有序,只执行一趟起泡,做初始排列已经有序,只执行一趟起泡,做 n- -1 次关键码比较,不移动对象。次关键码比较,不移动对象。最坏情形:最坏情形:初始排列逆序,初始排列逆序,算法要执行算法要执行n-1 1趟起泡,第趟起泡,第i趟趟(1 i n) 做了做了n- i 次关键码比较,执行了次关键码比较,执行了n-i 次对象交换。次对象交换。此时的比较总次数此时的比较总次数KCN和记录移动次数和记录移动次数RMN为:为:11111233121nininninRMNnninKCN)()()()(2930303131( )

31、,设以首元素为枢轴中心设以首元素为枢轴中心例例1:关键字序列关键字序列 T=(21,25,49,25*,16,08),请),请写出快速排序的算法步骤。写出快速排序的算法步骤。21, 25, 49, 25*,16, 08初态:初态:第第1趟:趟:第第2趟:趟:第第3趟:趟:08,16,21,25, 25*,(49)2116,08,( )25,25*,49(08),16,21,25,(25*,49)3232pivotkeypivotkey=21=21( 08 ,16 ) 21 ( 25* , 49, 25 )Low=high=Low=high=3 3,本趟停止,将本趟停止,将中枢点定位并返回位置信

32、息中枢点定位并返回位置信息例例2:关键字序列关键字序列 T=(21,25,49,25*,16,08),计算),计算机如何实现快速排序算法的某一趟过程?机如何实现快速排序算法的某一趟过程?ri0123456初态初态21254925*1608第第1趟趟highhighlowlow2125*321082516492525* *跑到了前面,跑到了前面,不稳定不稳定!设计技巧:设计技巧:交替交替/振荡式逼近振荡式逼近3333例例3:以关键字序列(以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,写出执行快速算法的各趟排序)为例,写出执行快速算法的各趟排序

33、结束时,关键字序列的状态。结束时,关键字序列的状态。原始序列:原始序列: 256256,301301,751751,129129,937937,863863,742742,694694,076076,438438第第1趟趟第第2趟趟第第3趟趟第第4趟趟256256,301301,751751,129129,937937,863863,742742,694694,076076,438438,129129,937937,863863,742742,694694,301301,438438要求按算法上机实现步骤要求按算法上机实现步骤076076301301129129751751,129129,43

34、8438,301301,694694,742742,694694,863863,937937,301301,694694,742742,937937,301301,301301,694694,742742,937937,742742,因为每趟确定的元素呈指数增加因为每趟确定的元素呈指数增加( (存每层存每层lowlow,highhigh和和pivot)pivot)因为有跳跃式交换。因为有跳跃式交换。3434讨论讨论1 1:如何编程实现?如何编程实现?分析:分析:每一趟子表的形成是采用从两头向中间交替式逼近法;每一趟子表的形成是采用从两头向中间交替式逼近法;由于每趟中对各子表的操作都相似,主程序

35、可采用递归算法。由于每趟中对各子表的操作都相似,主程序可采用递归算法。见教材见教材P275intint (SqList &L,int(SqList &L,int low low,int,int high high) ) /一趟快排一趟快排/交换子表交换子表 rlowrlowhighhigh的记录,使支点(枢轴)记录到位,并的记录,使支点(枢轴)记录到位,并返回其位置返回其位置。返回时,在支点之前的记录均不大于它,支点之后的记录均不小于它。返回时,在支点之前的记录均不大于它,支点之后的记录均不小于它。 r0=r0=rlowrlow ; ; /以子表的首记录作为支点记录,放入以子表

36、的首记录作为支点记录,放入r0r0单元单元(续下页)(续下页)一趟快速排序算法一趟快速排序算法(针对一个子表的操作)(针对一个子表的操作)3535pivotkeypivotkey= =rlow.keyrlow.key; ; /取支点的关键码存入取支点的关键码存入pivotkeypivotkey变量变量while(lowwhile(low high) high)/从表的两端交替地向中间扫描从表的两端交替地向中间扫描 while(while(lowlowhigh=pivotkeyrhigh.key=pivotkey ) ) rlow=rhigh rlow=rhigh; ; /比支点小的记录交换到低

37、端;比支点小的记录交换到低端; while(while(lowlowhighhigh & & rlow.key=pivotkeyrlow.key=pivotkey) ) rhigh=rlow rhigh=rlow; /比支点大的记录交换到高端;比支点大的记录交换到高端;rlowrlow=r0;=r0; /支点记录到位;支点记录到位;return return lowlow; ; /返回支点记录所在位置。返回支点记录所在位置。 /Partition/Partition3636从从高端高端扫描扫描寻找小于寻找小于pivot的元素的元素从从低端低端扫描扫描寻找大于寻找大于pivot的

38、元素的元素一趟快速排序算法流程图一趟快速排序算法流程图r0=rlow; pivot=rlow.key;low highlow =pivot- high;rlow = rhigh;low high &rlow.key=pivot- low;rhigh = rlow;rlow = r0;return low3737if ( low 1 /对顺序表对顺序表L中的子序列中的子序列r lowhigh 作快速排序作快速排序/一趟快排,将一趟快排,将r 一分为二一分为二/在左子区间进行递归快排,直到长度为在左子区间进行递归快排,直到长度为1/在右子区间进行递归快排,直到长度为在右子区间进行递归快排,

39、直到长度为1是局部变量是局部变量 1, L.length 对顺序表对顺序表L进行快速排进行快速排序的操作函数为:序的操作函数为:3838设每个子表的支点都在中间(比较均衡),则:设每个子表的支点都在中间(比较均衡),则:第第1 1趟比较,可以确定趟比较,可以确定1 1个元素的位置;个元素的位置;第第2 2趟比较(趟比较(2 2个子表),可以再确定个子表),可以再确定2 2个元素的位置;个元素的位置;第第3 3趟比较(趟比较(4 4个子表),可以再确定个子表),可以再确定4 4个元素的位置;个元素的位置;第第4 4趟比较(趟比较(8 8个子表),可以再确定个子表),可以再确定8 8个元素的位置;

40、个元素的位置; 只需只需 loglog2 2n n 1 1趟便可排好序。趟便可排好序。基本上是,因为每趟可以确定的数据元素是呈指数增加的。基本上是,因为每趟可以确定的数据元素是呈指数增加的。而且,每趟需要比较和移动的元素也呈指数下降,加上编程而且,每趟需要比较和移动的元素也呈指数下降,加上编程时使用了交替逼近技巧,更进一步减少了移动次数,所以速度时使用了交替逼近技巧,更进一步减少了移动次数,所以速度特别快。特别快。教材教材P276P276有证明:快速排序的平均排序效率为有证明:快速排序的平均排序效率为O(nlogO(nlog2 2n)n);但最坏情况下但最坏情况下( (例如天然有序例如天然有序) )仍为仍为O(nO(n2 2),),改进措施见改进措施见P277P277。3939选择排序有多种具体实现算法:选择排序有多种具体实现算法: 1) 简单选择排序简单选择排序 2) 锦标赛排序锦标赛排序 3) 堆排序堆排序40404141例:例:关键字序列关键字序列T= (21,25,4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论