• 1.92 MB
  • 2022-04-29 14:31:44 发布

数据结构课件PPT110章全 第十章 内部排序old.ppt

  • 227页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'1、概述2、插入排序3、快速排序4、选择排序5、归并排序6、基数排序7、讨论目录第十章内部排序 1、概述分类:内部排序:全部记录都可以同时调入内存进行的排序。外部排序:文件中的记录太大,无法全部将其同时调入内存进行的排序。定义:设有记录序列:{R1、R2………..Rn}其相应的关键字序列为:{K1、K2………..Kn};若存在一种确定的关系:Kx<=Ky<=…<=Kz则将记录序列{R1、R2………..Rn}排成按该关键字有序的序列:{Rx、Ry………..Rz}的操作,称之为排序。关系是任意的,如通常经常使用的小于、大于等关系。稳定与不稳定:若记录序列中的任意两个记录Rx、Ry的关键字Kx=Ky;如果在排序之前和排序之后,它们的相对位置保持不变,则这种排序方法是稳定的,否则是不稳定的。(有哪些排序方法是稳定的?哪些不稳定??)#defineMAXSIZE20typedefintKeyType;typedefstruct{KeyTypekey;InfoTypeotherinfo;}RedType;typedefstruct{RedTyper[MAXSIZE+1];//r[0]空或作哨兵intlength;}SqList; 1、概述排序中的基本操作:(1)比较关键字大小(2)移动记录前一种基本操作对大多数的排序方法是必须的,而后一个操作可以通过改变记录的存储方式来予以避免。排序评价标准执行时间比较次数移动次数所需附加空间算法复杂程度 1、概述待排序记录的存储方式:(1)存放在地址连续的一组存储单元中,记录之间的关系由存储位置决定,排序必须移动记录;(2)存在静态链表中,记录之间的关系由指针指示,排序不用移动记录,只需修改指针;(3)待排序记录本身存储在一组地址连续的存储单元内,同时附设一个指示记录存储位置的地址向量,排序过程中不移动记录,而移动地址向量中这些记录的地址,在排序结束后,再按照地址向量中的值调整记录的存储位置。书中算法所使用的数据类型:#defineMAXSIZE20typedefintKeyType;typedefstruct{KeyTypekey;InfoTypeotherinfo;}RedType;typedefstruct{RedTyper[MAXSIZE+1];//r[0]空或作哨兵intlength;}SqList; 2、插入排序基本方法:每步将一个待排序的记录按其关键字大小插入到前面已排序表中的适当位置,直到全部插入完为止。 r[0]用作哨兵。共执行5遍操作。每遍操作:先将元素复制内容放入r[0],再将本元素同已排序的序列,从尾开始进行比较。在已排序的序列中寻找自己的位置,进行插入。或者寻找不到,则一直进行到哨兵为止。意味着本元素最小,应该放在r[1]。每一遍,排序的序列将增加一个元素。如果序列中有n个元素,那么最多进行n遍即可。(实际只需要n-1遍)2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123456 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序012362410612345362424i7 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123453624i8 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123453624i249 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123453610i241010 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123453610i2411 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123453610i2412 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106123453610i241013 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序01236241061234536246i10614 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序01236241061234536246i1015 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序01236241061234536246i1016 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序01236241061234536246i1017 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序01236241061234536246i10618 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106345362412i106121219 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106345362412i1061220 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106345362412i1061221 2、插入排序e.g:36、24、10、6、12存放在r数组的下标为1至5的元素之中,用直接插入法将其排序。结果仍保存在下标为1至5的元素之中。1、直接插入排序0123624106345362412i106121222 2、插入排序1、直接插入排序01210203040345102040505030分析:移动、比较次数可作为衡量时间复杂性的标准正序时:比较次数∑1=n-1i=2移动次数0n逆序时:比较次数∑i=(n+2)(n-1)/2i=2移动次数∑(i+1)=(n+4)(n-1)/2i=2nnO(n2)23 2、插入排序1、直接插入排序01236241063453624121061212StatusInsertSort(SqList&L){for(i=2;i<=L.length;++i)if(LT(L.r[i].key,L.r[i-1].key)){L.r[0].key=L.r[i].key;for(j=i-1;LT(L.r[0].key,L.r[j].key);--j)L.r[j+1]=L.r[j];L.r[j+1]=L.r[0];}}//InsertSort程序实现:362410612i24 2、插入排序2、折半插入排序StatusBInsertSort(SqList&L){for(i=2;i<=L.length;++i){L.r[0]=L.r[i];low=1;high=i-1;while(low<=high){m=(low+high)/2;if(LT(L.r[0].key,L.r[m].key))high=m-1;elselow=m+1;}for(j=i-1;j>=high+1;--j)L.r[j+1]=L.r[j];L.r[high+1]=L.r[0];}}//BInsertSort程序实现:362410612362412high1061212方法:在已排序的序列中查找下一元素的插入位置,将该元素插入进去,形成更长的排序序列。如:12的插入位置为下标3。减少了比较次数,未降低时间复杂性。ilow25 2、插入排序2、折半插入排序362410612362412high1061212方法:在已排序的序列中查找下一元素的插入位置,将该元素插入进去,形成更长的排序序列。如:12的插入位置为下标3。减少了比较次数,未降低时间复杂性。ilow12362412high10612ilow12362412high10612ilow26 2、插入排序2、折半插入排序362410612362425high1062525方法:在已排序的序列中查找下一元素的插入位置,将该元素插入进去,形成更长的排序序列。如:12的插入位置为下标3。减少了比较次数,未降低时间复杂性。ilow12362425high10625ilow1236242510625ihighlow27 2、插入排序3.2-路插入排序只能减少移动记录次数,不能绝对避免移动记录。移动记录的次数约为n2/8。当中间位置选择为最小或最大值时,退化为直接插入排序。 2、插入排序4.表插入排序基本操作仍是将一个记录插入到已派好序的有序表中,唯一不同之处在于是以修改2n次指针值代替移动记录。复杂度为O(n2) 2、插入排序又称“缩小增量排序”(DiminishingIncrementSort)从直接插入排序的分析可知,当待排记录序列为“正序”时,其时间复杂度可提高到O(n),由此可设想,若待排记录序列按关键字“基本有序”时,直接插入排序的效率也比较高;另外,由于直接插入排序算法简单,在n值很小时效率也较高。因此从这两点出发设计一种算法就可以提高排序的效率。先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序“时,再对全体记录进行一次直接插入排序,就可以完成整个的排序工作。希尔排序的一个特点是:子序列的构成不是简单地“逐段分割”,而是将相隔某个增量的记录组成一个子序列。2、shell排序 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长8:49、38、65、97、76、13、27、49、55、4步长8:49、38、65、97、76、13、27、49、55、431 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长8:49、38、65、97、76、13、27、49、55、4步长8:49、4、65、97、76、13、27、49、55、38步长为8的序列的排序结束。32 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长4:49、4、65、97、76、13、27、49、55、38步长4:49、4、65、97、76、13、27、49、55、3833 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长4:49、4、27、49、55、13、65、97、76、38步长4:49、4、65、97、76、13、27、49、55、3834 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长2:49、4、27、49、55、13、65、97、76、38步长2:49、4、27、49、55、13、65、97、76、3835 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长2:27、4、49、13、55、38、65、49、76、97步长2:49、4、27、49、55、13、65、97、76、3836 2、插入排序2、shell排序e.g:将序列49、38、65、97、76、13、27、49、55、4用shell排序的方法进行排序1、选定步长序列,如选为8、4、2、12、针对步长序列进行排序,从最大的步长开始,逐步减少步长,最后一次选择的的步长肯定为1。步长1:27、4、49、13、55、33、65、49、76、97步长1:4、13、27、38、49、49、55、65、76、97最后的排序结果分析:shell排序的分析非常困难,原因是何种步长序列最优难以断定。通常认为时间复杂性为:O(n3/2).较好的步长序列:……121、40、13、4、1;可由递推公式Si=3Si-1+1产生。程序实现:类似于直接插入排序的程序。见书P272注意修改步长。37 课堂练习设记录的关键字集合K={23,9,39,5,68,12,62,48,33},给定的增量序列D={4,2,1},请写出对K按“SHELL方法”排序各趟排序结束时的结果。 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784949383865659797767613132727494939 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865659797767613132727494940 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865659797767613132727494941 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865659797767613132727494942 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865659797767613132727494943 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697769713132727494944 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697769713132727494945 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697761397132727494946 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697761397132727494947 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697761327132797494948 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697761327132797494949 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。0123456784938493865657697761327132749974950 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965761327499751 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965761327499752 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965761327499753 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965761327499754 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965137627499755 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965137627499756 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965132776499757 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965132776499758 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849657613274997384965132749769759 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384965132749769760 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384965132749769761 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384965132749769762 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384913652749769763 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384913652749769764 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384913276549769765 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384913276549769766 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849651327497697384913274965769767 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849132749657697384913274965769768 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849132749657697384913274965769769 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849132749657697381349274965769770 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849132749657697381349274965769771 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849132749657697381327494965769772 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973849132749657697381327494965769773 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973813274949657697381327494965769774 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973813274949657697133827494965769775 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973813274949657697133827494965769776 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973813274949657697132738494965769777 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749973813274949657697132738494965769778 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749971327384949657697132738494965769779 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749971327384949657697132738494965769780 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。01234567838496576132749971327384949657697132738494965769781 3、快速排序1、起泡排序原理:若序列中有n个元素,通常进行n-1趟。第1趟,针对第r[1]至r[n]个元素进行。第2趟,针对第r[1]至r[n-1]个元素进行。……第n-1趟,针对第r[1]至r[2]个元素进行。每一趟进行的过程:从第一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素。结束条件:在任何一趟进行过程中,未出现交换。e.g:将序列49、38、65、97、76、13、27、49用起泡排序的方法进行排序。012345678384965761327499713273849496576971327384949657697时间复杂性:正序时O(n),逆序时O(n2)。平均时间复杂性O(n2)。82 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点83 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点84 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点85 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点86 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点87 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点88 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点89 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点90 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点91 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点92 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点93 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点94 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678493838656597977676131327274949highlow49界点95 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678273838136597497676139765274949highlow49界点96 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678273838136597497676139765274949highlow49界点97 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678273838136597497676139765274949highlow49界点98 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678273838136597497676139765274949highlow49界点99 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678273838136597497676139765274949highlow49界点100 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点101 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点102 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点103 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点104 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点105 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点106 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点107 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597497676139765274949highlow49界点108 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597494976136576274997highlow49界点109 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597494976136576274997highlow49界点110 3、快速排序2、快速排序原理:若序列中有n个元素,任选一个界点的关键字作为界点,将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。e.g:将序列49、38、65、97、76、13、27、49用快速排序的方法进行排序。012345678133827386597494976136576274997highlow49界点111 3、快速排序2、快速排序程序实现:VoidQuickSort(SqList&L){QSort(L,1,L.length);}//QuickSort//对顺序表L进行快速排序VoidQSort(SqList&L,intlow,inthigh){if(low=pivotkey)--high;L.r[low]=L.r[high];while(lowL.r[j];}}//SelectSort SelectionSort:PassOneindex[0][1][2][3][4]2410612UNSORTED118 SelectionSort:EndPassOneindex[0][1][2][3][4]6102412UNSORTEDSORTED119 SelectionSort:PassTwoindex[0][1][2][3][4]6102412UNSORTEDSORTED120 SelectionSort:EndPassTwoindex[0][1][2][3][4]6102412UNSORTEDSORTED121 SelectionSort:PassThreeindex[0][1][2][3][4]6102412UNSORTEDSORTED122 SelectionSort:EndPassThreeindex[0][1][2][3][4]6101224SORTED123 SelectionSort: HowManyComparisons?3comparesforvalues[1]2comparesforvalues[2]1compareforvalues[3]=3+2+16101224index[0][1][2][3][4]124 ForSelectionSortinGeneralThenumberofcomparisonswhenthearraycontainsNelementsisSum=(N-1)+(N-2)+...+2+1=O(n2)125 4、选择排序2、树性选择排序BAOBAODIAOCHABAODIAOWANGZHAOCHALIUBAODIAOYANGXUEWANG 4、选择排序2、树性选择排序DIAOCHADIAOWANGZHAOCHALIUDIAOYANGXUEWANG 4、选择排序2、树性选择排序CHACHADIAOCHALIUDIAOWANGZHAOCHALIU*DIAOYANGXUEWANG 4、选择排序2、树性选择排序DIAOLIUDIAOWANGZHAOLIU*DIAOYANGXUEWANG 4、选择排序2、树性选择排序DIAOLIUDIAOZHAOLIUDIAOWANGZHAO*LIU*DIAOYANGXUEWANG 4、选择排序改进:简单选择排序没有利用上次选择的结果,是造成速度慢的重要原因。如果,能够加以改进,将会提高排序的速度。2、树性选择排序381376276549974938651327133813选出最小者13 4、选择排序改进:简单选择排序没有利用上次选择的结果,是造成速度满的重要原因。如果,能够加以改进,将会提高排序的速度。2、树性选择排序381376276549974938651327133813选出次最小者,应利用上次比较的结果。从被13打败的结点27、76、38中加以确定。 4、选择排序3、堆排序堆的定义:n元素的序列{k1,k2,……,kn},当且仅当满足以下关系时,称之为堆:ki<=k2iki>=k2iki<=k2i+1ki>=k2i+1(i=1,2,……,n/2)且分别称之为最小化堆和最大化堆。e.g:序列{96,83,27,11,9}最大化堆{12,36,24,85,47,30,53,91}最小化堆或96911832723145124785913624533062731845 70604030128rootThelargestelement inamaximum-heapisalwaysfoundintherootnode10134 [1][2][3][4][5][6][7]706012403081070160240430512386root107Theheapcanbestored inanarray135 HeapSortApproach先将未排序的序列按堆的条件放入堆中,然后重复下面的步骤直到排序成功。从堆顶取出最大或最小元素堆顶元素与堆的最后一个元素交换位置对未剩余的元素进行调整通过调整选择剩下元素中的最大或最小元素136 Aftercreatingtheoriginalheap7060124030610values[1][2][3][4][5][6][7]70160240430512366root107137 Swaprootelementintolastplaceinunsortedarray7060124030610values70160240430512366root107[1][2][3][4][5][6][7]138 Afterswappingrootelement intoitsplacevalues1060124030670NONEEDTOCONSIDERAGAIN[1][2][3][4][5][6][7]10160240430512366root707139 Afterreheapingremainingunsortedelementsvalues6040121030670[1][2][3][4][5][6][7]60140210430512366root707140 Swaprootelementintolastplaceinunsortedarray6040121030670[1][2][3][4][5][6][7]60140210430512366root707141 Afterswappingrootelement intoitsplacevalues6401210306070NONEEDTOCONSIDERAGAIN[1][2][3][4][5][6][7]61402104305123606root707142 values4030121066070Afterreheapingremainingunsortedelements[1][2][3][4][5][6][7]40130210465123606root707143 values4030121066070Swaprootelementintolastplaceinunsortedarray[1][2][3][4][5][6][7]40130210465123606root707144 valuesAfterswappingrootelement intoitsplace6301210406070NONEEDTOCONSIDERAGAIN[1][2][3][4][5][6][7]61302104405123606root707145 values3010126406070Afterreheapingremainingunsortedelements[1][2][3][4][5][6][7]30110264405123606root707146 values3010126406070Swaprootelementintolastplaceinunsortedarray[1][2][3][4][5][6][7]30110264405123606root707147 valuesAfterswappingrootelement intoitsplace6101230406070NONEEDTOCONSIDERAGAIN[1][2][3][4][5][6][7]61102304405123606root707148 values1210630406070Afterreheapingremainingunsortedelements[1][2][3][4][5][6][7]12110230440563606root707149 values1210630406070Swaprootelementintolastplaceinunsortedarray[1][2][3][4][5][6][7]12110230440563606root707150 valuesAfterswappingrootelement intoitsplaceNONEEDTOCONSIDERAGAIN6101230406070[1][2][3][4][5][6][7]61102304405123606root707151 values1061230406070Afterreheapingremainingunsortedelements[1][2][3][4][5][6][7]10162304405123606root707152 values1061230406070Swaprootelementintolastplaceinunsortedarray[1][2][3][4][5][6][7]30510710162304405123606root707153 valuesAfterswappingrootelement intoitsplace6101230406070ALLELEMENTSARESORTED[1][2][3][4][5][6][7]61102304405123606root707154 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级70160240430512386107root[1][2][3][4][5][6][7]7060124030810155 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级30160240470583126107root[1][2][3][4][5][6][7]3060840701210叶子结点,符合堆的的定义。不合堆的定义,需调整。即建立小堆。建立的第一个小堆的堆顶的下标为n/2156 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级30160240470512386107root[1][2][3][4][5][6][7]3060124070810叶子结点,符合堆的的定义。不合堆的定义,需调整。即建立小堆。建立的第一个小堆的堆顶的下标为n/2157 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级30160240470512386107root[1][2][3][4][5][6][7]3060124070810不合堆的定义,需调整。建立以L[2]为堆顶的正确的最大化小堆。158 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级30170240460512386107root[1][2][3][4][5][6][7]3070124060810不合堆的定义,需调整。建立以L[2]为堆顶的正确的最大化小堆。159 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级30170240460512386107root[1][2][3][4][5][6][7]3070124060810不合堆的定义,需调整。建立以L[1]为堆顶的正确的最大化堆。160 4、选择排序3、堆排序时间复杂性的分析:建堆的时间耗费:比较次数=4n次O(n)级70130240460512386107root[1][2][3][4][5][6][7]7030124060810不合堆的定义,需调整。建立以L[1]为堆顶的正确的最大化堆。161 4、选择排序3、堆排序建堆的时间耗费:比较次数=4n次O(n)级70160240430512386107root[1][2][3][4][5][6][7]7060124030810不合堆的定义,需调整。建立以L[1]为堆顶的正确的最大化堆。162 4、选择排序3、堆排序voidHeapSort(HeapType&H){for(i=H.length/2;i>0;--i)HeapAdjust(H,i,H.length);for(i=H.length;i>1;--i){H.r[1]H.r[i];HeapAdjust(H,1,i-1);}}voidHeapAdjust(HeapType&H,ints,intm){rc=H.r[s];for(j=2*s;j<=m;j*=2){if(j=n(n-1)(n-2)……(n/2)>=(n/2)n/2∴log(n!)>=(n/2)log(n/2)>=(n/4)logn∴在最坏情况下至少需要cnlogn次比较,即下界为Ω(nlogn)即借助于“比较”进行排序,在最坏的情况下能达到的最好的时间复杂度为O(nlogn).3、注意:2介绍的是在比较的前提的下界,并不意味着,在任何情况下,下界都为Ω(nlogn)高为n-1具有2(n-2)片叶子高为n-1具有2(n-2)片叶子H=1H=2H=n226 作业题集10.4,10.25'