书签 分享 收藏 举报 版权申诉 / 90
上传文档赚钱

类型(数据结构课件)ch9内部排序.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:5193296
  • 上传时间:2023-02-16
  • 格式:PPT
  • 页数:90
  • 大小:1.49MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《(数据结构课件)ch9内部排序.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    数据结构 课件 ch9 内部 排序
    资源描述:

    1、1数据结构课程的内容数据结构课程的内容29.1 9.1 概述概述9.2 9.2 插入排序插入排序9.3 9.3 交换排序交换排序9.4 9.4 选择排序选择排序9.5 9.5 归并排序归并排序9.6 9.6 基数排序基数排序39.1 9.1 概述概述1.什么是排序?什么是排序?将一组杂乱无章的将一组杂乱无章的数据数据按一定的按一定的规律规律顺次排列起顺次排列起来。来。2.排序的目的是什么?排序的目的是什么?存放在数据表中存放在数据表中按关键字排序按关键字排序3.排序算法的好坏如何衡量?排序算法的好坏如何衡量?时间效率时间效率排序速度(即排序所花费的全部比较次数)排序速度(即排序所花费的全部比较

    2、次数)空间效率空间效率占内存辅助空间的大小占内存辅助空间的大小 稳定性稳定性若两个记录若两个记录A A和和B B的关键字值相等,但排序后的关键字值相等,但排序后A A、B B的先后次序保持不变,则称这种排序算法是稳定的。的先后次序保持不变,则称这种排序算法是稳定的。便于查找!便于查找!44.什么叫内部排序?什么叫外部排序什么叫内部排序?什么叫外部排序?若待排序记录都在内存中,称为内部排序;若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存,则若待排序记录一部分在内存,一部分在外存,则称为外部排序。称为外部排序。注:注:外部排序时,要将数据分批调入内存来排序,中间外部排

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

    4、接移动元素)6.6.顺序存储(顺序表)的抽象数据类型如何表示?顺序存储(顺序表)的抽象数据类型如何表示?Typedef struct /定义每个记录(数据元素)的结构定义每个记录(数据元素)的结构 KeyType key;/关键字关键字 InfoType otherinfo;/其它数据项其它数据项RecordType;Typedef struct /定义顺序表的结构定义顺序表的结构 RecordType r MAXSIZE+1;/存储顺序表的向量存储顺序表的向量 /r0/r0一般作哨兵或缓冲区一般作哨兵或缓冲区 int length;/顺序表的长度顺序表的长度SqList;#define MA

    5、XSIZE 20 /设记录不超过设记录不超过2020个个typedef int KeyType;/设关键字为整型量(设关键字为整型量(intint型)型)67.内部排序的算法有哪些?内部排序的算法有哪些?按排序的规则不同,可分为按排序的规则不同,可分为5类:类:插入排序插入排序交换排序(重点是快速排序)交换排序(重点是快速排序)选择排序选择排序归并排序归并排序基数排序基数排序d关键字的位数关键字的位数(长度长度)按排序算法的时间复杂度不同,可分为按排序算法的时间复杂度不同,可分为3类:类:简单的排序算法:时间效率低,简单的排序算法:时间效率低,O(n2)先进的排序算法先进的排序算法:时间效率高

    6、,时间效率高,O(nlog2n)基数排序算法:时间效率高,基数排序算法:时间效率高,O(dn)79.2 9.2 插入排序插入排序插入排序有多种具体实现算法:插入排序有多种具体实现算法:1)直接插入排序直接插入排序 2)折半插入排序折半插入排序 3)表插入排序表插入排序 4)希尔排序希尔排序8新元素插入到哪里?新元素插入到哪里?例例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

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

    8、525*161616080808解:解:假设该序列已存入一维数组假设该序列已存入一维数组V7V7中,将中,将V0V0作为缓冲或作为缓冲或暂存单元(暂存单元(TempTemp)。则程序执行过程为:)。则程序执行过程为:初态:初态:时间效率:时间效率:因为在因为在最坏情况下最坏情况下,所有元素的比较,所有元素的比较次数总和为(次数总和为(0 01 1n-1)O(nn-1)O(n2 2)。其他情况。其他情况下还要加上移动元素的次数。下还要加上移动元素的次数。空间效率:空间效率:因为仅占用因为仅占用1 1个缓冲单元个缓冲单元算法的稳定性:算法的稳定性:因为因为2525*排序后仍然在排序后仍然在2525

    9、的后面。的后面。对应程序参见教材对应程序参见教材P265P265。10Void InsertSort(SqList&L)/对顺序表对顺序表L做直接插入排序做直接插入排序 for(i=2;i=L.length;+i)if(LT(L.ri.key,L.ri-1.key)/“,需将需将L.ri插入有序子表插入有序子表 L.r0=L.ri;/复制为哨兵复制为哨兵 L.ri=L.ri-1;for(j=i-2;LT(L.r0.key,L.ri.key);-j)L.r j+1=L.r j;/记录后移记录后移 L.r j+1=L.r0;/插入到正确位置插入到正确位置 /InsertSort1112nininn

    10、niRMNnn2)niKCN2222141221/)()(,/)(221314优点:优点:比较的次数大大减少比较的次数大大减少。时间效率:时间效率:虽然比较次数大大减少,可惜移动次数并未减少,虽然比较次数大大减少,可惜移动次数并未减少,所以排序效率仍为所以排序效率仍为O(nO(n2 2)。空间效率:空间效率:O O(1 1)稳定性:稳定性:稳定稳定新元素插入到哪里?新元素插入到哪里?在已形成的在已形成的有序表中折半查找有序表中折半查找,并在适,并在适当位置插入,把原来位置上的元素向后当位置插入,把原来位置上的元素向后顺移顺移。15Void BInsertSort(SqList&L)/折半插入排

    11、序折半插入排序 for(i=2;i=L.length;+i)L.r0=L.r i;/将将L.r i 暂存到暂存到L.r0 low=1;high=i-1;while(low=high+1;-j)L.r j+1=L.r j;/记录后移记录后移 L.r high+1=L.r 0;/插入插入 /for /BInsertSort1617讨论:讨论:若记录是链表结构,用直接插入排序行否?折半插入若记录是链表结构,用直接插入排序行否?折半插入排序呢?排序呢?答:答:直接插入不仅可行,而且还无需移动元素,时间效率更直接插入不仅可行,而且还无需移动元素,时间效率更高!高!18回忆:回忆:链表排序链表排序排序时只

    12、移动指针;排序时只移动指针;地址排序地址排序排序时先移动地址,最后再移动记录。排序时先移动地址,最后再移动记录。191例:例:关键字序列关键字序列 T=(21,25,49,25*,16,08),),请写出表插入排序的具体实现过程。请写出表插入排序的具体实现过程。解:解:假设该序列(结构类型假设该序列(结构类型)已存入一维数组已存入一维数组V7V7中,将中,将V0V0作为表头结点。则作为表头结点。则算法执行过程算法执行过程为:为:i 关键字关键字 Vi.key指针指针 Vi.link0 MaxNum1212253494 25*516608指向第指向第1 1个元素个元素指向头结点指向头结点0300

    13、2*表示后一个表示后一个252520Void Arrange(SLinkListType&SL)p=SL.r0.next;/p指示第一个记录的当前位置指示第一个记录的当前位置 for(i=1;i=SL.length;+i)/SL.r1.i-1中记录已按关键字有序排列中记录已按关键字有序排列 while(pi)p=Sl.rp.next;/找到第找到第i个记录,并用个记录,并用p指示其在指示其在SL中当前位置中当前位置 q=SL.rp.next;/q指示尚未调整的表尾指示尚未调整的表尾 if(p!=i)SL.rp SL.ri;/交换记录,使第交换记录,使第i个记录到位个记录到位 SL.ri.nex

    14、t=p;/指向被移走的记录,使得以后可由指向被移走的记录,使得以后可由while循环找回循环找回 /if p=q;/p指示尚未调整的表尾,为第指示尚未调整的表尾,为第i+1个记录作准备个记录作准备 /for /Arrange21表插入排序算法分析:表插入排序算法分析:无需移动记录,只需修改无需移动记录,只需修改2n次指针值。但由于比较次指针值。但由于比较次数没有减少,故次数没有减少,故时间效率仍为时间效率仍为O(n2)。空间效率肯定低空间效率肯定低,因为增开了指针分量(但在运算,因为增开了指针分量(但在运算过程中没有用到更多的辅助单元)。过程中没有用到更多的辅助单元)。稳定性:稳定性:25和和

    15、25*排序前后次序未变,排序前后次序未变,稳定稳定。讨论:讨论:此算法得到的只是一个有序链表,查找记录时只此算法得到的只是一个有序链表,查找记录时只能满足顺序查找方式。能满足顺序查找方式。改进:改进:可以根据表中指针线索,很快对所有记录重排,可以根据表中指针线索,很快对所有记录重排,形成形成真正的有序表(顺序存储方式),从而能满足真正的有序表(顺序存储方式),从而能满足折半查找方式。折半查找方式。具体实现见教材具体实现见教材P269。22)2338例:例:关键字序列关键字序列 T=(49,38,65,97,76,13,27,49*,55,04),请写出希尔排序的具体实现过程。),请写出希尔排序

    16、的具体实现过程。0123456789104938659776132749*5504初初 态:态:第第1趟趟(dk=5)第第2趟趟(dk=3)第第3趟趟(dk=1)4913134938276549*975576042738 65 49*9755135576045513270427044949*4949*763876 65 65 9797551327044949*3876 65 9713 27 0449*76 97 算法分析:算法分析:开始时开始时dk 的值较大,子序列中的对象较少,排序速度的值较大,子序列中的对象较少,排序速度较快;随着排序进展,较快;随着排序进展,dk 值逐渐变小,子序列中对象

    17、个数值逐渐变小,子序列中对象个数逐渐变多,由于前面工作的基础,大多数对象已基本有序,逐渐变多,由于前面工作的基础,大多数对象已基本有序,所以排序速度仍然很快。所以排序速度仍然很快。24void ShellSort(SqList&L,int dlta,int t)/按增量序列按增量序列dlta0t-1对顺序表对顺序表L作作Shell排序排序 for(k=0;kt;+k)ShellSort(L,dltak);/增量为增量为dltak的一趟插入排序的一趟插入排序 /ShellSort时间效率:时间效率:空间效率:空间效率:因为仅占用因为仅占用1 1个缓冲单元个缓冲单元算法的稳定性:算法的稳定性:因为

    18、因为4949*排序后却到了排序后却到了4949的前面的前面参见教材参见教材P272P272经验公式经验公式dkdk值依次装在值依次装在dltadltatt中中2526void ShellInsert(SqList&L,int dk)for(i=dk+1;i=L.length;+i)if(ri.key 0&(r0.keyrj.key);j=j-dk)rj+dk=rj;rj+dk=r0;参见教材参见教材P272P272/对顺序表对顺序表L进行一趟增量为进行一趟增量为dk的的Shell排序,排序,dk为步长因子为步长因子/开始将开始将ri 插入有序增量子表插入有序增量子表/暂存在暂存在r0/关键字较

    19、大的记录在子表中后移关键字较大的记录在子表中后移/在本趟结束时将在本趟结束时将ri插入到正确位置插入到正确位置27课堂练习:课堂练习: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一趟后:一趟后:2.以关键字序列(以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下算法的)为例,分别写

    20、出执行以下算法的各趟各趟排序结束时,关排序结束时,关键字序列的状态,并说明这些排序方法中,哪些易于在链表(包键字序列的状态,并说明这些排序方法中,哪些易于在链表(包括各种单、双、循环链表)上实现?括各种单、双、循环链表)上实现?直接插入排序直接插入排序 希尔排序(取希尔排序(取dk=5,3,1)P,Q,R,A,D,H,C,F,M,S,X,Y答:答:显然,直接插入排序方法易于在链表上实现;但希尔排显然,直接插入排序方法易于在链表上实现;但希尔排序方法因为是按增量选择记录,不易于在链表上实现。序方法因为是按增量选择记录,不易于在链表上实现。两种排序方法的中间状态分别描述如后:两种排序方法的中间状态

    21、分别描述如后:28原始序列:原始序列:256256,301301,751751,129129,937937,863863,742742,694694,076076,438438 256256,301301,751751,129129,937937,863863,742742,694694,076076,438438 256256,301301,751751,129129,937937,863863,742742,694694,076076,438438 129129,256256,301301,751751,937937,863863,742742,694694,076076,438438 1

    22、29129,256256,301301,751751,937937,863863,742742,694694,076076,438438 129129,256256,301301,751751,863863,937937,742742,694694,076076,438438 129129,256256,301301,742742,751751,863863,937937,694694,076076,438438 129129,256256,301301,694694,742742,751751,863863,937937,076076,438438 076076,129129,256256,

    23、301301,694694,742742,751751,863863,937937,438438 076076,129129,256256,301301,438438,694694,742742,751751,863863,937937 第第1趟趟第第2趟趟第第3趟趟第第4趟趟第第5趟趟第第6趟趟第第7趟趟第第8趟趟第第9趟趟29原始序列:原始序列:256256,301301,751751,129129,937937,863863,742742,694694,076076,438438256256,301301,751751,129129,937937,863863,742742,694694

    24、,076076,438438256256,301301,751751,129129,937937,863863,742742,694694,076076,438438256256,301301,694694,129129,937937,863863,742742,751751,076076,438438256256,301301,694694,076076,937937,863863,742742,751751,129129,438438256256,301301,694694,076076,438438,863863,742742,751751,129129,937937第第1趟趟dk=5第

    25、第2趟趟dkdk=3=3第第3趟趟dkdk=1=1256256,301301,694694,076076,438438,863863,742742,751751,129129,937937256256,301301,694694,076076,438438,863863,742742,751751,129129,937937076076,301301,694694,256256,438438,863863,742742,751751,129129,937937076076,301301,694694,256256,438438,863863,742742,751751,129129,93793

    26、7076076,301301,694694,256256,438438,863863,742742,751751,129129,937937076076,301301,129129,256256,438438,694694,742742,751751,863863,937937076076,301301,129129,256256,438438,694694,742742,751751,863863,937937076076,301301,129129,256256,438438,694694,742742,751751,863863,937937076076,129129,256256,30

    27、1301,438438,694694,742742,751751,863863,937937309.3 9.3 交换排序交换排序交换排序的主要算法有:交换排序的主要算法有:1)冒泡排序冒泡排序 2)快速排序快速排序31 1)基本思路:基本思路:每趟不断将记录两两比较,并按每趟不断将记录两两比较,并按“前小后大前小后大”(或(或“前大后小前大后小”)规则交换。)规则交换。优点:优点:每趟结束时,不仅能挤出一个最大值到最后面位置,每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;一旦下趟没有交换发还能同时部分理顺其他元素;一旦下趟没有交换发生,还可以提前结束排序。生,还可以提

    28、前结束排序。前提:前提:顺序存储结构顺序存储结构 例:例:关键字序列关键字序列 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趟趟32冒泡排序的算法分析冒泡排序的算法分析详细分析:详细分析:最好情况:最好情况:初始排列已经有序,只执行一趟起泡,做初始排列已经有序

    29、,只执行一趟起泡,做 n-1 次关键码比较,不移动对象。次关键码比较,不移动对象。最坏情形:最坏情形:初始排列逆序,初始排列逆序,算法要执行算法要执行n-1 1趟起泡,第趟起泡,第i趟趟(1 i n)做了做了n-i 次关键码比较,执行了次关键码比较,执行了n-i 次对象交换。次对象交换。此时的比较总次数此时的比较总次数KCN和记录移动次数和记录移动次数RMN为:为:11111233121nininninRMNnninKCN)()()()(3334(),设以首元素为枢轴中心设以首元素为枢轴中心例例1:关键字序列关键字序列 T=(21,25,49,25*,16,08),请写出快速排序的算法步骤。)

    30、,请写出快速排序的算法步骤。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)35编程时:编程时:每一趟的子表的形成是采用从两头向中间交替式逼近法;每一趟的子表的形成是采用从两头向中间交替式逼近法;由于每趟中对各子表的操作都相似,主程序可采用递归算法。由于每趟中对各子表的操作都相似,主程序可采用递归算法。见教材见教材P275intint (SqList&L,(SqList&L,intint low low,intint high hi

    31、gh)/一趟快排一趟快排/交换子表交换子表 rlowrlowhighhigh的记录,使支点(枢轴)记录到位,并返回其位置。的记录,使支点(枢轴)记录到位,并返回其位置。返回时,在支点之前的记录均不大于它,支点之后的记录均不小于它。返回时,在支点之前的记录均不大于它,支点之后的记录均不小于它。r0=r0=rlowrlow;/以子表的首记录作为支点记录,放入以子表的首记录作为支点记录,放入r0r0单元单元(续下页)(续下页)一趟快速排序算法(针对一个子表的操作)一趟快速排序算法(针对一个子表的操作)36pivotkeypivotkey=rlow.keyrlow.key;/取支点的关键码存入取支点的

    32、关键码存入pivotkeypivotkey变量变量while(low high)while(low high)/从表的两端交替地向中间扫描从表的两端交替地向中间扫描while(while(lowhighlow=pivotkeyrhigh.key=pivotkey)rlow=rhigh;rlow=rhigh;/将比支点小的记录交换到低端;将比支点小的记录交换到低端;while(while(lowhighlowhigh&rlow.key=pivotkeyrlow.key=pivotkey)rhigh=rlow;rhigh=rlow;/将比支点大的记录交换到高端;将比支点大的记录交换到高端;rlow

    33、=r0;rlow=r0;/支点记录到位;支点记录到位;return low;return low;/返回支点记录所在位置。返回支点记录所在位置。/37例例2:关键字序列关键字序列 T=(21,25,49,25*,16,08),),请写出快速排序算法的一趟实现过程。请写出快速排序算法的一趟实现过程。ri0123456初态初态21254925*1608第第1趟趟highhighlowlow210825164925*321pivotkeypivotkey=212108251649(08,16)21 (25*,49,25 )38j从高端从高端扫描扫描寻找小于寻找小于pivot的元素的元素i从低端从低端

    34、扫描扫描寻找大于寻找大于pivot的元素的元素i=low;j=high;r0=rlow;pivot=rlow.key;i ji=pivot-j;ri=rj;i j&ri.key=pivot-i;rj=ri;ri=r0;return ok;39void QSort(SqList&L,int low,int high)if(low 1/对顺序表对顺序表L中的子序列中的子序列r lowhigh 作快速排序作快速排序/一趟快排,将一趟快排,将r 一分为二一分为二/在左子区间进行递归快排,直到长度为在左子区间进行递归快排,直到长度为1/在右子区间进行递归快排,直到长度为在右子区间进行递归快排,直到长度为

    35、1/QSort新的新的low 1,L.length 40例例3:以关键字序列(以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,写出执行快速算法的)为例,写出执行快速算法的各各趟趟排序结束时,关键字序列的状态。排序结束时,关键字序列的状态。原始序列:原始序列:256256,301301,751751,129129,937937,863863,742742,694694,076076,438438第第1趟趟第第2趟趟第第3趟趟第第4趟趟256256,301301,751751,129129,937937,863863,742742,694694,

    36、076076,438438,129129,937937,863863,742742,694694,301301,438438要求模拟算法实现步骤要求模拟算法实现步骤076076301301129129751751,129129,438438,301301,694694,742742,694694,863863,937937,301301,694694,742742,937937,301301,301301,694694,742742,937937,742742,41可以证明,函数可以证明,函数quicksort的平均计算时间也是的平均计算时间也是O(nlog2n)。实实验结果表明:就平均计算时

    37、间而言,快速排序是我们所讨论验结果表明:就平均计算时间而言,快速排序是我们所讨论的所有内排序方法中最好的一个的所有内排序方法中最好的一个。快速排序是递归的,需要有一个栈存放每层递归调用时的指快速排序是递归的,需要有一个栈存放每层递归调用时的指针和参数针和参数(新的(新的lowlow和和highhigh)。最大递归调用层次数与递归树最大递归调用层次数与递归树的深度一致,理想情况为的深度一致,理想情况为 log2(n+1)log2(n+1)。因此,要求存储开。因此,要求存储开销为销为 o(log2n)o(log2n)。最好情况:最好情况:如果每次划分对一个对象定位后,该对象的左侧如果每次划分对一个

    38、对象定位后,该对象的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况。此时,快速排减半的子序列进行排序,这是最理想的情况。此时,快速排序的趟数最少。序的趟数最少。42最坏情况:最坏情况:即待排序对象序列已经按其关键码从小到大即待排序对象序列已经按其关键码从小到大排好序的情况下,排好序的情况下,其递归树成为单支树其递归树成为单支树,每次划分只得到,每次划分只得到一个比上一次少一个对象的子序列。这样,必须经过一个比上一次少一个对象的子序列。这样,必须经过 n-1 趟才能把所有对象定位,而且第趟才能把所

    39、有对象定位,而且第 i 趟需要经过趟需要经过 n-i 次关次关键码比较才能找到第键码比较才能找到第 i 个对象的安放位置,总的关键码比个对象的安放位置,总的关键码比较次数将达到较次数将达到n n2 2/2/2 快速排序是一个快速排序是一个不稳定的不稳定的排序方法排序方法43设每个子表的支点都在中间(比较均衡),则:设每个子表的支点都在中间(比较均衡),则:第第1 1趟比较,可以确定趟比较,可以确定1 1个元素的位置;个元素的位置;第第2 2趟比较(趟比较(2 2个子表),可以再确定个子表),可以再确定2 2个元素的位置;个元素的位置;第第3 3趟比较(趟比较(4 4个子表),可以再确定个子表)

    40、,可以再确定4 4个元素的位置;个元素的位置;第第4 4趟比较(趟比较(8 8个子表),可以再确定个子表),可以再确定8 8个元素的位置;个元素的位置;只需只需 loglog2 2n n 1 1趟便可排好序。趟便可排好序。而且,每趟需要比较和移动的元素也呈指数下降,加上编程而且,每趟需要比较和移动的元素也呈指数下降,加上编程时使用了交替逼近技巧,更进一步减少了移动次数,所以速度时使用了交替逼近技巧,更进一步减少了移动次数,所以速度特别快。特别快。教材教材P276P276有证明:快速排序的平均排序效率为有证明:快速排序的平均排序效率为O(nlogO(nlog2 2n)n);但最坏情况但最坏情况(

    41、例如已经有序例如已经有序)下仍为下仍为O(nO(n2 2),),改进措施见改进措施见P277P277。44选择排序有多种具体实现算法:选择排序有多种具体实现算法:1)简单选择排序简单选择排序 2)锦标赛排序锦标赛排序 3)堆排序堆排序4546例:例:关键字序列关键字序列T=(21,25,49,25*,16,08),),请给出简单选择排序的具体实现过程。请给出简单选择排序的具体实现过程。原始序列:原始序列:21,25,49,25*,16,08第第1趟趟第第2趟趟第第3趟趟第第4趟趟第第5趟趟08,25,49,25*,16,2108,16,49,25*,25,2108,16,21,25*,25,4

    42、908,16,21,25*,25,4908,16,21,25*,25,49时间效率:时间效率:虽移动次数较少,但比较次数仍多。虽移动次数较少,但比较次数仍多。空间效率:空间效率:交换时用到一个暂存单元!交换时用到一个暂存单元!算法的稳定性:算法的稳定性:因为排序时,因为排序时,2525*到了到了2525的前面。的前面。最小值最小值 0808 与与r1r1交换位置交换位置47(亦可参见教材(亦可参见教材P276P276)Void SelectSort(SqList&L)for(i=1;iL.length;+i)j=SelectMinKey(L,i);if(i!=j)ri rj;/SelectSo

    43、rt/对顺序表对顺序表L L作简单选择排序作简单选择排序/选择第选择第i i小的记录,并交换到位小的记录,并交换到位/在在rri iL.L.lengthlength 中选择中选择keykey最小的记录最小的记录/与第与第i i个记录交换个记录交换48(又称树形选择排序又称树形选择排序)例:例:关键字序列关键字序列T=(21,25,49,25*,16,08,63),),请给出锦标赛排序的具体实现过程。请给出锦标赛排序的具体实现过程。49注:注:为便于自动处理,建议每个记录多开两个特殊分量:为便于自动处理,建议每个记录多开两个特殊分量:keyotherinfoIndex(结点位置编号)结点位置编号

    44、)Tag(是否参加比较)(是否参加比较)50求次小值求次小值1616时时,只需比较只需比较次,即只比较次,即只比较令其令其TagTag0,0,不参与比较不参与比较51令其令其TagTag0,0,不参与比较不参与比较5253545556n个记录各自比较约个记录各自比较约log2n次次胜者树的附加内结点共有胜者树的附加内结点共有n-1个!个!左右结点相同者左为先左右结点相同者左为先n=2n=2k k=叶子总数叶子总数5758234561(大根堆)(大根堆)2345617有序列有序列T1=(08,25,49,46,58,67)和序列)和序列T2=(91,85,76,66,58,67,55),判断它们

    45、是否判断它们是否“堆堆”?(小根堆)(小根堆)(小顶堆)(小顶堆)(最小堆)(最小堆)(大顶堆)(大顶堆)(最大堆)(最大堆)59123456例:例:关键字序列关键字序列T=(21,25,49,25*,16,08),请建),请建大根堆大根堆。解:解:为便于理解,先将原始序列画成完全二叉树的形式:为便于理解,先将原始序列画成完全二叉树的形式:注:注:终端结点(即叶子)没有任何子女,无需单独调整。终端结点(即叶子)没有任何子女,无需单独调整。49大于大于08,不必调整;,不必调整;25大于大于25*和和16,也不必调整;,也不必调整;21小于小于25和和49,要调整!,要调整!而且而且21还应当向

    46、下比较!还应当向下比较!60Void HeapAdjust(HeapType&H,int s,int m)/rc=H.rs;for(j=2*s;j=m;j*=2)/沿沿key较大的孩子结点向下筛选较大的孩子结点向下筛选 if(j0;-i)HeapAdjust(H,i,H.length);/初始堆初始堆 for(i=H.length;i 1;-i)H.r1 H.ri;/交换,要借用交换,要借用temp HeapAdjust(H,1,i-1);/重建最大堆重建最大堆 这是针对结点这是针对结点i i 的堆调整函数的堆调整函数(也是建堆函(也是建堆函数)数),每次调用耗时,每次调用耗时O(logO(l

    47、og2 2n)n)6869比较左右孩比较左右孩子大小,子大小,j指指向大者向大者比较大孩子比较大孩子与与rc的大小的大小若大向上浮若大向上浮rc=H.rs;j=2s;jm&H.rj.keyH.rj+1.key+j;/指向右兄弟指向右兄弟j H.rj.keyH.rs=H.rj;s=j;j=2*j;/指向左孩子指向左孩子NNNYYYH.rsm中除中除rs外,其他具有堆特征外,其他具有堆特征现调整现调整rs的值的值,使,使H.rsm为堆为堆70HeapAdjust()719.5 9.5 归并排序归并排序关键字序列关键字序列T=(21,25,49,25*,93,62,72,08,37,16,54),请

    48、给出归并排序的具体实),请给出归并排序的具体实现过程。现过程。7273void(SR,&TR,i,m,n)/将将有序的有序的SRim和和SRm+1n归并为归并为有序的有序的TRin for(k=i,j=m+1;+k)if(SRi=SRj)TRk=SRi+;else TRk=SRj+;/将将SR中记录由小到大地并入中记录由小到大地并入TR if(i=m)TRkn=SRim;/将剩余的将剩余的SRim复制到复制到TR if(j=n)TRkn=SRjn;/将剩余的将剩余的SRjn复制到复制到TR /Merge74 void(SR,&TR1,s,t)/将无序的将无序的SRst归并排序为归并排序为TR1

    49、st if(s=t)TR1s=SRs;/当当len=1时返回时返回 else m=(s+t)/2;/将将SR st平分为平分为SR sm和和SR m+1t (SR,&TR2,s,m);/将将SR 一分为二一分为二,2分为分为4 /递归地将递归地将SR sm归并为有序的归并为有序的TR2sm (SR,&TR2,m+1,t);/递归地将递归地将SR m+1t归并为有序的归并为有序的TR2m+1t (TR2,TR1,s,m,t);/将将TR2 sm和和TR2 m+1t归并到归并到TR1 st /MSort简言之,先由简言之,先由“长长”无序变成无序变成“短短”有有序,序,再从再从“短短”有序归并为有

    50、序归并为“长长”有有序。序。初次调用时为(初次调用时为(L,L,1,length)75一趟归并排序的操作是:调用一趟归并排序的操作是:调用n/2h次算法次算法merge将将SR1.n中中前后相邻且长度为前后相邻且长度为h的有序段进行两两归并,得到前后相邻长的有序段进行两两归并,得到前后相邻长度为度为2h的有序段,并存放在的有序段,并存放在TR1.n中,整个归并排序需要进中,整个归并排序需要进行行log2n 趟趟,所以算法总的时间复杂度为所以算法总的时间复杂度为O(nlog2n)。因为需要一个与原始序列同样大小的辅助序列(因为需要一个与原始序列同样大小的辅助序列(TR)。这正)。这正是此算法的缺

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:(数据结构课件)ch9内部排序.ppt
    链接地址:https://www.163wenku.com/p-5193296.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库