数据结构课件排序.ppt
《数据结构课件排序.ppt》由会员分享,可在线阅读,更多相关《数据结构课件排序.ppt(51页珍藏版)》请在沃文网上搜索。
1、数据结构课程的内容数据结构课程的内容一、教学内容:一、教学内容:1 1、插入排序(直接插入排序、折半插入排序、希尔排序);、插入排序(直接插入排序、折半插入排序、希尔排序);2 2、交换排序(起泡排序、快速排序);、交换排序(起泡排序、快速排序);3 3、选择排序(直接选择排序、堆排序);、选择排序(直接选择排序、堆排序);4 4、归并排序;、归并排序;5 5、基数排序;、基数排序;二、教学要求:二、教学要求:1 1、掌握排序的基本概念和各种排序方法的特点,并能加以灵、掌握排序的基本概念和各种排序方法的特点,并能加以灵活应用;活应用;2 2、掌握插入排序、交换排序、选择排序的方法及其性能分析、
2、掌握插入排序、交换排序、选择排序的方法及其性能分析方法;方法;3 3、了解归并排序、基数排序方法。、了解归并排序、基数排序方法。第第1010章章 内部排序内部排序10.1 10.1 概述概述10.210.2 插入排序插入排序10.3 10.3 交换排序交换排序10.4 10.4 选择排序选择排序10.5 10.5 归并排序归并排序10.6 10.6 基数排序基数排序第第1010章章 内部排序内部排序10.1 10.1 概述概述1.什么是排序?什么是排序?将一组杂乱无章的将一组杂乱无章的数据数据按一定的按一定的规律规律顺次排列起来。顺次排列起来。存放在数据表中存放在数据表中按按关键字排序关键字排
3、序定义:设有记录序列:定义:设有记录序列:R1 R1、R2 .R2 .RnRn 其相应的关键字序列为:其相应的关键字序列为:K1 K1、K2 K2 KnKn ;若存在一种确定的关系:若存在一种确定的关系:KxKx=KyKy=KzKz则则将记录序列将记录序列 R1 R1、R2 .R2 .RnRn 排成按排成按该关键字有序的序列:该关键字有序的序列:Rx Rx、RyRy.RzRz 的的操作,称之为排序。操作,称之为排序。2.排序的目的是什么?排序的目的是什么?3.3.排序算法的好坏如何衡量?排序算法的好坏如何衡量?时间效率时间效率排序速度(即排序所花费的全部比较次数)排序速度(即排序所花费的全部比
4、较次数)空间效率空间效率占内存辅助空间的大小占内存辅助空间的大小稳稳定定性性若若两两个个记记录录A A和和B B的的关关键键字字值值相相等等,但但排排序序后后A A、B B的先后次序保持不变,则称这种排序算法是稳定的。的先后次序保持不变,则称这种排序算法是稳定的。便于查找!便于查找!4.什么叫内部排序?什么叫外部排序什么叫内部排序?什么叫外部排序?若待排序记录都在内存中,称为内部排序;若待排序记录都在内存中,称为内部排序;若待排序记录一部分在内存,一部分在外存,则若待排序记录一部分在内存,一部分在外存,则称为外部排序。称为外部排序。注:注:外部排序时,要将数据分批调入内存来排序,中间外部排序时
5、,要将数据分批调入内存来排序,中间结果还要及时放入外存,显然外部排序要复杂得多。结果还要及时放入外存,显然外部排序要复杂得多。大多数排序算法都有两个基本的操作:大多数排序算法都有两个基本的操作:(1)比较两个关键字的大小)比较两个关键字的大小(2)将记录从一个位置移动到另一个位置)将记录从一个位置移动到另一个位置注:注:大多数排序算法都是针对顺序表结构的大多数排序算法都是针对顺序表结构的(便于直接移动元素便于直接移动元素)5.顺序存储(顺序表)的抽象数据类型如何表示?顺序存储(顺序表)的抽象数据类型如何表示?Typedefstruct/定义每个记录(数据元素)的结构定义每个记录(数据元素)的结
6、构KeyTypekey;/关键字关键字InfoTypeotherinfo;/其它数据项其它数据项RecordType;Typedefstruct/定义顺序表的结构定义顺序表的结构RecordTyperMAXSIZE+1;/存储顺序表的向量存储顺序表的向量 /r0/r0一般作哨兵或缓冲区一般作哨兵或缓冲区intlength;/顺序表的长度顺序表的长度SqList;#defineMAXSIZE20/设记录不超过设记录不超过2020个个typedefintKeyType;/设关键字为整型量(设关键字为整型量(intint型)型)6.内部排序的算法有哪些?内部排序的算法有哪些?按排序的规则不同,可分为
7、按排序的规则不同,可分为5类:类:插入排序插入排序交换排序(重点是快速排序)交换排序(重点是快速排序)选择排序选择排序归并排序归并排序基数排序基数排序d关键字的位数关键字的位数(长度长度)按排序算法的时间复杂度不同,可分为按排序算法的时间复杂度不同,可分为3类:类:简单的排序算法:时间效率低,简单的排序算法:时间效率低,O(n2)先进的排序算法先进的排序算法:时间效率高,时间效率高,O(nlog2n)基数排序算算法:时间效率高,基数排序算算法:时间效率高,O(dn)10.210.2 插入排序插入排序插入排序的基本思想是:插入排序的基本思想是:插入排序的基本思想是:插入排序的基本思想是:插入排序
8、有多种具体实现算法:插入排序有多种具体实现算法:1)直接插入排序直接插入排序2)折半插入排序折半插入排序3)希尔排序希尔排序每步将一个待排序的对象,每步将一个待排序的对象,每步将一个待排序的对象,每步将一个待排序的对象,按其关键码大小,按其关键码大小,按其关键码大小,按其关键码大小,插入到前面插入到前面插入到前面插入到前面已经排好序的一组对象已经排好序的一组对象已经排好序的一组对象已经排好序的一组对象的的的的适当位置适当位置适当位置适当位置上上上上,直到对象全部插入为止。,直到对象全部插入为止。,直到对象全部插入为止。,直到对象全部插入为止。简言之,边插入边排序,保证子序列中随时都是排好序的。
9、简言之,边插入边排序,保证子序列中随时都是排好序的。简言之,边插入边排序,保证子序列中随时都是排好序的。简言之,边插入边排序,保证子序列中随时都是排好序的。1)1)直接插入排序直接插入排序新元素插入到哪里?新元素插入到哪里?例例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【3,6,9,13,31】,27,5,11【3,6,9,
10、13,27,31】,5,11【3,5,6,9,13,27,31】,11【3,5,6,9,11,13,27,31】在已形成的在已形成的有序表中有序表中线性查找线性查找,并在,并在适当位置插入,把原来位置上的元素向后适当位置插入,把原来位置上的元素向后顺移顺移。最简单的排序法!最简单的排序法!最简单的排序法!最简单的排序法!例例2:关键字序列关键字序列T=(21,25,49,25*,16,08),),请写出直接插入排序的具体实现过程。请写出直接插入排序的具体实现过程。*表示后一个表示后一个2525i i=1=121212525494925*25*161608080123456暂暂存存2121i i
11、=2=2i i=3=3i i=5=5i i=4=4i i=6=62525252525494949494925*25*25*494916161625*25*0808084949解:解:假设该序列已存入一维数组假设该序列已存入一维数组V7V7中,将中,将V0V0作为缓冲或作为缓冲或暂存单元(暂存单元(TempTemp)。)。则程序执行过程为:则程序执行过程为:21212525494925*25*2121初态:初态:1616494925*25*2525212116160808完成!对应程序参见教材对应程序参见教材P265P265。void void Insertsort(SqListInsertso
12、rt(SqList*L)*L)intint i,j;i,j;for(i=2;ilength;i+)for(i=2;ilength;i+)L-r0=L-ri;L-r0=L-ri;j=i-1;j=i-1;while(L-r0.keyrj.key)while(L-r0.keyrj.key)L-rj+1=L-rj;L-rj+1=L-rj;j-;j-;L-rj+1=L-r0;L-rj+1=L-r0;直接插入排序的演示直接插入排序的演示n n若设待排序的对象个数为若设待排序的对象个数为若设待排序的对象个数为若设待排序的对象个数为n n,则算法需要进行则算法需要进行则算法需要进行则算法需要进行n n-1-1
13、次插入。次插入。次插入。次插入。n n最好情况下:最好情况下:最好情况下:最好情况下:排序前对象已经按关键码大小从小到大有序,每排序前对象已经按关键码大小从小到大有序,每排序前对象已经按关键码大小从小到大有序,每排序前对象已经按关键码大小从小到大有序,每趟只需与前面的有序对象序列的趟只需与前面的有序对象序列的趟只需与前面的有序对象序列的趟只需与前面的有序对象序列的最后一个对象最后一个对象最后一个对象最后一个对象的的的的关键码比较关键码比较关键码比较关键码比较 1 1 1 1 次,移动次,移动次,移动次,移动 2 2 2 2 次对象。因此,总的次对象。因此,总的次对象。因此,总的次对象。因此,总
14、的关键码比较次数为关键码比较次数为关键码比较次数为关键码比较次数为n n-1-1,对象移动次数为对象移动次数为对象移动次数为对象移动次数为 2(2(n n-1)-1)。直接插入排序的算法分析直接插入排序的算法分析最坏情况下:最坏情况下:最坏情况下:最坏情况下:第第第第i i趟插入时,第趟插入时,第趟插入时,第趟插入时,第i+1i+1个对象必须与前面个对象必须与前面个对象必须与前面个对象必须与前面i i个对象个对象个对象个对象都做关键码比较,并且每做都做关键码比较,并且每做都做关键码比较,并且每做都做关键码比较,并且每做 1 1 1 1 次比较就要做次比较就要做次比较就要做次比较就要做 1 1
15、1 1 次数据移动。则总的关键码比较次数次数据移动。则总的关键码比较次数次数据移动。则总的关键码比较次数次数据移动。则总的关键码比较次数KCNKCN和和和和对象移动次数对象移动次数对象移动次数对象移动次数RMNRMN分别为分别为分别为分别为 若待排序对象序列中出现各种可能排列的概率若待排序对象序列中出现各种可能排列的概率若待排序对象序列中出现各种可能排列的概率若待排序对象序列中出现各种可能排列的概率相同,则可取上述最好情况和最坏情况的平均情况相同,则可取上述最好情况和最坏情况的平均情况相同,则可取上述最好情况和最坏情况的平均情况相同,则可取上述最好情况和最坏情况的平均情况。在平均情况下的关键码
16、比较次数和对象移动次数。在平均情况下的关键码比较次数和对象移动次数。在平均情况下的关键码比较次数和对象移动次数。在平均情况下的关键码比较次数和对象移动次数约为约为约为约为 n n2 2/4/4。因此,直接插入排序的时间复杂度为因此,直接插入排序的时间复杂度为因此,直接插入排序的时间复杂度为因此,直接插入排序的时间复杂度为 o o(n n2 2)。直接插入排序是一种稳定的排序方法。直接插入排序是一种稳定的排序方法。直接插入排序是一种稳定的排序方法。直接插入排序是一种稳定的排序方法。2 2)折半插入排序折半插入排序优点:优点:比较的次数大大减少,全部元素比较次数仅为比较的次数大大减少,全部元素比较
17、次数仅为O(nlogO(nlog2 2n)n)。时时间间效效率率:虽虽然然比比较较次次数数大大大大减减少少,可可惜惜移移动动次次数数并并未未减减少少,所以排序效率仍为所以排序效率仍为O(nO(n2 2)。空间效率:空间效率:O O(1 1)稳定性:稳定性:稳定稳定新元素插入到哪里?新元素插入到哪里?在已形成的在已形成的有序表中有序表中折半查找折半查找,并在适,并在适当位置插入,把原来位置上的元素向后当位置插入,把原来位置上的元素向后顺移顺移。若记录是链表结构,用直接插入排序行否?折半若记录是链表结构,用直接插入排序行否?折半插入排序呢?插入排序呢?答:答:直接插入不仅可行,而且还无需移动元素,
18、时间直接插入不仅可行,而且还无需移动元素,时间效率更高!效率更高!但链表无法但链表无法但链表无法但链表无法“折半折半折半折半”!讨论讨论 loglog2 2i i +1+1折半插入排序的算法分析折半插入排序的算法分析折半查找比顺序查找快,所以折半插入排序就折半查找比顺序查找快,所以折半插入排序就折半查找比顺序查找快,所以折半插入排序就折半查找比顺序查找快,所以折半插入排序就平均性能来说比直接插入排序要快。平均性能来说比直接插入排序要快。平均性能来说比直接插入排序要快。平均性能来说比直接插入排序要快。在插入第在插入第在插入第在插入第 i i 个对象时,需要经过个对象时,需要经过个对象时,需要经过
19、个对象时,需要经过 次次次次关键码比较,才能确定它应插入的位置。因此,关键码比较,才能确定它应插入的位置。因此,关键码比较,才能确定它应插入的位置。因此,关键码比较,才能确定它应插入的位置。因此,将将将将 n n 个对象用折半插入排序所进行的关键码个对象用折半插入排序所进行的关键码个对象用折半插入排序所进行的关键码个对象用折半插入排序所进行的关键码比较次数为:比较次数为:比较次数为:比较次数为:n*logn*log2 2n n折半插入排序是一个稳定的排序方法。折半插入排序是一个稳定的排序方法。折半插入排序是一个稳定的排序方法。折半插入排序是一个稳定的排序方法。3 3)希尔()希尔(shells
20、hell)排序(又称缩小增量排序)排序(又称缩小增量排序)基本思想基本思想基本思想基本思想:先将整个待排记录序列分割成若干子序列:先将整个待排记录序列分割成若干子序列:先将整个待排记录序列分割成若干子序列:先将整个待排记录序列分割成若干子序列,分分分分别进行直接插入排序,待整个序列中的记录别进行直接插入排序,待整个序列中的记录别进行直接插入排序,待整个序列中的记录别进行直接插入排序,待整个序列中的记录“基本有序基本有序基本有序基本有序”时,再对全体记录进行一次直接插入排序。时,再对全体记录进行一次直接插入排序。时,再对全体记录进行一次直接插入排序。时,再对全体记录进行一次直接插入排序。技巧:技
21、巧:技巧:技巧:子序列的构成不是简单地子序列的构成不是简单地子序列的构成不是简单地子序列的构成不是简单地“逐段分割逐段分割逐段分割逐段分割”,而是将,而是将,而是将,而是将相隔某个增量相隔某个增量相隔某个增量相隔某个增量dkdkdkdk的的的的记录组成一个子序列记录组成一个子序列记录组成一个子序列记录组成一个子序列,让增量让增量让增量让增量dkdkdkdk逐趟逐趟逐趟逐趟缩缩缩缩短(例如依次取短(例如依次取短(例如依次取短(例如依次取5,3,15,3,15,3,15,3,1),直到),直到),直到),直到dkdkdkdk1 1 1 1为止。为止。为止。为止。优点:优点:优点:优点:让关键字值小
22、的元素能很快前移,且序列若基本让关键字值小的元素能很快前移,且序列若基本让关键字值小的元素能很快前移,且序列若基本让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多。有序时,再用直接插入排序处理,时间效率会高很多。有序时,再用直接插入排序处理,时间效率会高很多。有序时,再用直接插入排序处理,时间效率会高很多。38例:例:关键字序列关键字序列 T=(49T=(49,3838,6565,97,76,13,27,4997,76,13,27,49*,55,55,0404),),请写出希尔排序的具体实现过程。请写出希尔排序的具体实现过程。01234567891049
23、38659776132749*5504初态:初态:第第1趟趟(dk=5)第第2趟趟(dk=3)第第3趟趟(dk=1)4913134938276549*9755760427386549*9755135576045513270427044949*4949*7638766565 9797551327044949*387665 9713270449*76 97算法分析:算法分析:开始时开始时dk 的值较大,子序列中的对象较少,排序速度的值较大,子序列中的对象较少,排序速度较快;随着排序进展,较快;随着排序进展,dk值逐渐变小,子序列中对象个数值逐渐变小,子序列中对象个数逐渐变多,由于前面工作的基础,大
24、多数对象已基本有序,逐渐变多,由于前面工作的基础,大多数对象已基本有序,所以排序速度仍然很快。所以排序速度仍然很快。riri时间效率:时间效率:空间效率:空间效率:O O O O(1 1 1 1)因为仅占用因为仅占用1 1个缓冲单元个缓冲单元算法的稳定性:算法的稳定性:不稳定不稳定不稳定不稳定因为因为4949*排序后却到了排序后却到了4949的前面的前面O(O(O(O(n n1.251.25)O O O O(1.61.6n n1.251.25)经验公式经验公式课堂练习:课堂练习:n-1log2n2log2nn*n1、初始序列已经按键值有序时,用直接插入算法进、初始序列已经按键值有序时,用直接插
25、入算法进行排序,需要比较的次数是()行排序,需要比较的次数是()2.欲将序列(欲将序列(Q,H,C,Y,P,A,M,S,R,D,F,X)中的关中的关键码按字母升序重排,则初始步长为键码按字母升序重排,则初始步长为4的希尔排序一趟的希尔排序一趟的结果是?的结果是?答:答:原始序列:原始序列:Q,H,C,Y,P,A,M,S,R,D,F,Xshellshell一趟后:一趟后:P,Q,R,A,D,H,C,F,M,S,X,Y3.以以关关键键字字序序列列(256,301,751,129,937,863,742,694,076,438)为为例例,分分别别写写出出执执行行以以下下算算法法的的各各趟趟排排序序结
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 排序