概述插入排序交换排序选择排序归并排序基数排序外排序课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《概述插入排序交换排序选择排序归并排序基数排序外排序课件.ppt》由会员分享,可在线阅读,更多相关《概述插入排序交换排序选择排序归并排序基数排序外排序课件.ppt(83页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、vv概述概述vv插入排序插入排序vv交换排序交换排序vv选择排序选择排序vv归并排序归并排序vv基数排序基数排序vv外排序外排序 第九章 排序什么是排序(Sorting)?vv简单地说,排序就是将一组杂乱无简单地说,排序就是将一组杂乱无章的数据按一定的规律排列起来。章的数据按一定的规律排列起来。vv排序是计算机中经常遇到的操作。排序是计算机中经常遇到的操作。排序的几个基本概念vv数据表数据表(Data List)待排序的数据对象的待排序的数据对象的有限集合。有限集合。vv关键码关键码(Key)作为排序依据的数据对象中作为排序依据的数据对象中的属性域。的属性域。vv主关键码主关键码 不同的数据对
2、象若不同的数据对象若关键码互不关键码互不相同相同,则这种关键码称为主关键码。,则这种关键码称为主关键码。vv排序的确切定义排序的确切定义 使一组任意排列的对象使一组任意排列的对象变成一组变成一组按关键码线性有序按关键码线性有序的对象。的对象。排序的几个基本概念vv排序算法的稳定性排序算法的稳定性 判断标准:关键码判断标准:关键码相同的数据对象在排序过程中是否保持前后相同的数据对象在排序过程中是否保持前后次序不变。如次序不变。如 2,2*,1,排序后若为,排序后若为1,2*,2 则该排序方法是不稳定的。则该排序方法是不稳定的。vv内排序与外排序内排序与外排序 区分标准:区分标准:排序过程排序过程
3、是否全部在是否全部在内存内存进行。进行。vv排序的时间开销排序的时间开销 它是衡量算法好坏的它是衡量算法好坏的最重要的标志。通常用算法执行中的最重要的标志。通常用算法执行中的数据比数据比较次数较次数和和数据移动次数数据移动次数来衡量来衡量 静态排序中的数据表的类定义静态排序中的数据表的类定义const const intint DefaultSizeDefaultSize=100;=100;Template class Template class datalistdatalist;Templateclass ElementTemplateclass Elementfriend friend
4、calsscalss datalistdatalist;private:private:Type key;Type key;field field otherdataotherdata;public:public:Type Type getKeygetKey()return key;()return key;void void setKey(constsetKey(const Type x)key=x;Type x)key=x;Element&operator=(Element&x)Element&operator=(Element&x)key=x-key=x-key;otherdatakey
5、;otherdata=x-=x-otherdataotherdata;Type operator=(Type&x)Type operator=(Type&x)return key=x-key;return key=x-key;Type operator=(Type&x)return keykey;Type operator=(Type&x)return keykey;Type operator=(Type&x)return key=x-key;Type operator=(Type&x)return key=x-key;Type operator (Type&x)return keykey;T
6、ype operator (Type&x)return keykey;templateclass templateclass datalistdatalist private:private:Element*Vector;Element*Vector;intint MaxSize,CurrentSizeMaxSize,CurrentSize;intint Partition(const Partition(const intint low,const low,const intint high)high)public;public;datalistdatalist(intint MaxSzMa
7、xSz=DefaultSize):MaxSizeDefaultSize):MaxSize(MaxSzMaxSz););void Swap(Element&x,Element&y)void Swap(Element&x,Element&y)Element temp=x;x=y;y=temp;Element temp=x;x=y;y=temp;void Sort();void Sort();9.2 插入排序(Insert Sorting)vv基本原理,每步将一个待排序的对基本原理,每步将一个待排序的对象,按其关键码大小,插入到前面象,按其关键码大小,插入到前面已经排好序的一组对象适当位置上,已经排
8、好序的一组对象适当位置上,直到对象全部插入为止。直到对象全部插入为止。三种常见的插入排序vv分类原理,根据往已经排好序的有分类原理,根据往已经排好序的有序数据表中寻找插入位置的方法的序数据表中寻找插入位置的方法的不同而区分。不同而区分。vv 直接插入排序直接插入排序(Insert Sort)vv 折半插入排序折半插入排序(Binary Insert Sort)vv 链表插入排序链表插入排序 vv 希尔排序希尔排序(Shell Sort)直接插入排序(Insert Sort)vv基本思想:当插入第基本思想:当插入第i个对象时,前个对象时,前面的面的V0,V1,Vi-1已经排好序,已经排好序,此时
9、,用此时,用vi的关键码与的关键码与Vi-1,Vi-2,的关键码顺序进行比较,找到的关键码顺序进行比较,找到插入位置即将插入位置即将Vi插入,原来位置上插入,原来位置上对象向后顺移。对象向后顺移。直接插入排序举例i (0)(1)(2)(3)(4)(5)temp 21 25 49 25*16 08 251 21 25 49 25*16 08 492 21 25 49 25*16 08 25*3 21 25 25*49 16 08 164 16 21 25 25*49 08 08 5 08 16 21 25 25*49 直接插入排序程序直接插入排序程序Templatevoid Templatevo
10、id dataListdataList:sort:sort Element Elementtemp;inttemp;int j;j;for(intfor(int i=1;i i=1;i0;j-)j=i;j0;j-)if(tempVectorj-1)Vectorj=Vectorj-if(tempVectorj-1)Vectorj=Vectorj-1;1;else break;else break;Vectorj=temp;Vectorj=temp;直接插入排序的时间复杂度vv考虑关键码的比较次数和对象移动次考虑关键码的比较次数和对象移动次数,数,最好情况时两者分别为最好情况时两者分别为n-1与与
11、2(n-1),最坏情况时两者分别为最坏情况时两者分别为vv KCN=1+2+.+n-1=n(n-1)/2vv RMN=(1+2)+(2+2)+.+(n-1+2)=(n+4)(n-1)/2直接插入排序的稳定性vv直接插入排序是一种稳定的排序方法。直接插入排序是一种稳定的排序方法。vv原理:关键码相同的两个对象,在整原理:关键码相同的两个对象,在整个排序过程中,不会通过比较而相互个排序过程中,不会通过比较而相互交换。交换。折半插入排序(Binary Insert Sort)vv基本思想:当插入第基本思想:当插入第i个对象时,前个对象时,前面的面的V0,V1,Vi-1已经排好序,已经排好序,此时,用
12、折半查找法寻找此时,用折半查找法寻找Vi的插入的插入位置移。位置移。折半插入排序程序折半插入排序程序template void template void datalistdatalist :sort():sort()intint left,right;Element temp;left,right;Element temp;for(for(intint i=1;i i=1;iCurrentSize;iCurrentSize;i+)+)left=0;right=i-1;temp=Vectori;left=0;right=i-1;temp=Vectori;while(left =right)wh
13、ile(left =right)intint middle=(left+right)/2;middle=(left+right)/2;if(temp Vectormiddle)if(temp=left;k-)k=i-1;k=left;k-)Vectork+1=Vectork;Vectork+1=Vectork;Vectorleft=temp;Vectorleft=temp;折半插入排序的时间复杂度vv考虑关键码的比较次数和对象移动次考虑关键码的比较次数和对象移动次数数 1.KCN 约为约为 n log 2 n,且与对象序列且与对象序列的初始排列无关的初始排列无关 当当n较大时,总关键码比较次数
14、比直较大时,总关键码比较次数比直接插入排序的最坏情况要好得多,但接插入排序的最坏情况要好得多,但比其最好情况时要差。比其最好情况时要差。2.RMN与直接插入排序相同。与直接插入排序相同。折半插入排序的稳定性vv折半插入排序是一种稳定的排序方法。折半插入排序是一种稳定的排序方法。vv原理:关键码相同的两个对象,在整原理:关键码相同的两个对象,在整个排序过程中,不会通过比较而相互个排序过程中,不会通过比较而相互交换。交换。链表插入排序vv基本思想:用链表来表示已排序的基本思想:用链表来表示已排序的数据对象,当插入数据对象,当插入Vi时,依次在链时,依次在链表中检查,找到表中检查,找到Vi应插入的位
15、置,应插入的位置,并修改相应的链接指针。如此重复,并修改相应的链接指针。如此重复,直到直到Vn也插入到链表中排好序为止。也插入到链表中排好序为止。链表插入排序的数据结构链表插入排序的数据结构template class template class staticlinkliststaticlinklist templateclass Elementtemplateclass Elementprivate:private:Type key;Type key;intint link;link;public:public:Type Type getKeygetKey()return key;()re
16、turn key;void void setKey(constsetKey(const Type x)key=x;Type x)key=x;intint getLink()returngetLink()return link;link;void void setLink(constsetLink(const intint ptr)linkptr)link=ptrptr;链表插入排序的数据结构链表插入排序的数据结构templateclass templateclass staticlinkliststaticlinklist private:private:Element *Vector;Ele
17、ment *Vector;intint MaxSizeMaxSize,CurrentSizeCurrentSize;public:public:staticlinklist(intstaticlinklist(int MaxSzMaxSz=DefaultSizeDefaultSize):):MaxSize(MaxSize),CurrentSize(0);MaxSize(MaxSize),CurrentSize(0);链表插入排序示例链表插入排序示例i index (0)(1)(2)(3)(4)(5)(6)key MaxNum 21 25 49 25*16 8 link 1 0 0 0 0 0
18、02 link 1 2 0 0 0 0 03 link 1 2 3 0 0 0 04 link 1 2 4 0 3 0 05 link 5 2 4 0 3 1 06 link 6 2 4 0 3 1 5链表插入排序的算法链表插入排序的算法template template intint staticlinkliststaticlinklist :Sort():Sort()Vector0.key=Vector0.key=MaxNumMaxNum;Vector0.link=1;Vector0.link=1;Vector1.link=0;Vector1.link=0;for(intfor(int i
19、=2;i=i=2;i=CurrentSizeCurrentSize;i+);i+)intint current=Vector0.link;current=Vector0.link;intint pre=0;pre=0;while(Vectorcurrent.key=while(Vectorcurrent.key=Vectori.key)Vectori.key)pre=i;current=Vectorcurrent.link;pre=i;current=Vectorcurrent.link;Vectori.link=current;Vectori.link=current;Vectorpre.l
20、ink=i;Vectorpre.link=i;链表插入排序的时间复杂度vv考虑关键码的比较次数和对象移动次考虑关键码的比较次数和对象移动次数数 1.KCN 最小为最小为n-1,最大为最大为 n(n-1)/2 2.对象移动次数为对象移动次数为0。链表插入排序方法是稳定的。链表插入排序方法是稳定的。希尔排序vv1959年由年由D.L.Shell提出,又称缩小提出,又称缩小增量排序增量排序(Diminishing-increment sort)。vv基本思想:在插入排序中,只比较相基本思想:在插入排序中,只比较相邻的结点,一次比较最多把结点移动邻的结点,一次比较最多把结点移动一个位置。如果对位置间隔
21、较大距离一个位置。如果对位置间隔较大距离的结点进行比较,使得结点在比较以的结点进行比较,使得结点在比较以后能够一次跨过较大的距离,这样就后能够一次跨过较大的距离,这样就可以提高排序的速度。可以提高排序的速度。希尔排序的基本过程vv设待排序的对象序列有设待排序的对象序列有n个对象,首个对象,首先取一个整数先取一个整数gapn作为间隔,将作为间隔,将全部对象分为全部对象分为gap个子序列,所有距个子序列,所有距离为离为gap的对象放在同一个序列中,的对象放在同一个序列中,在每一个子序列中分别施行直接插在每一个子序列中分别施行直接插入排序,然后缩小间隔入排序,然后缩小间隔gap,如取如取gap=ga
22、p/2,重复上述的子序列划重复上述的子序列划分和排序工作,直到最后分和排序工作,直到最后取取gap为为1为止。为止。希尔排序示例希尔排序示例i (0)(1)(2)(3)(4)(5)gap 21 25 49 25*16 08 1 21 -25*3 25 -16 49 -08 21 16 08 25*25 492 21 -08 -25 2 16 -25*-49 08 16 21 25*25 493 08 16 21 25*25 49 1 08 16 21 25*25 49希尔排序的算法希尔排序的算法template void template void datalistdatalist :sort
23、():sort()Elementtemp;Elementtemp;intint gap=CurrentSize/2,i,j;gap=CurrentSize/2,i,j;while(gap!=0)while(gap!=0)for(for(intint i=gap;i i=gap;i=gap;j-=gap)for(j=i;j=gap;j-=gap)if(tempVectorj-gap)if(tempVectorj-gap)Vectorj=Vectorj-gap;Vectorj=Vectorj-gap;else break;else break;Vectorj=temp;Vectorj=temp;g
24、ap=gap/2;gap=gap/2;希尔排序中gap的取法vvShell最初的方案是最初的方案是 gap=n/2,gap=gap/2,直到直到gap=1.vvKnuth的的方案是方案是gap=gap/3+1vv其它方案有,都取奇数为好;或其它方案有,都取奇数为好;或gap互质为好等等。互质为好等等。希尔排序的时间复杂度vv对希尔排序的复杂度的分析很困难,在对希尔排序的复杂度的分析很困难,在特定情况下可以准确地估算关键码的比特定情况下可以准确地估算关键码的比较和对象移动次数,但是考虑到与增量较和对象移动次数,但是考虑到与增量之间的依赖关系,并要给出完整的数学之间的依赖关系,并要给出完整的数学分
25、析,目前还做不到。分析,目前还做不到。vvKnuth的统计结论是,平均比较次数和的统计结论是,平均比较次数和对象平均移动次数在对象平均移动次数在n1.25 与与1.6n1.25之间。之间。vv希尔排序的稳定性希尔排序的稳定性 希尔排序是一种不稳定的排序方法。希尔排序是一种不稳定的排序方法。如序列如序列 3 2 2*59.3 交换排序vv基本原理,两两比较待排序的对象的基本原理,两两比较待排序的对象的关键码,如果发生逆序,则交换之,关键码,如果发生逆序,则交换之,直到全部对象都排好序为止。直到全部对象都排好序为止。两种常见的交换排序两种常见的交换排序vv起泡排序起泡排序(Bubble Sort)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 概述 插入 排序 交换 选择 归并 基数排序 外排 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内