第九章排序.ppt
《第九章排序.ppt》由会员分享,可在线阅读,更多相关《第九章排序.ppt(89页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 排序排序概述概述 插入排序插入排序快速排序快速排序交换排序交换排序(起泡排序)(起泡排序)选择排序选择排序归并排序归并排序1概述概述排排序序:将将一一组组杂杂乱乱无无章章的的数数据据按按一一定定的的规规律律顺顺次次排列起来。排列起来。数据表数据表(datalist):它是待排序数据元素的有限集合。它是待排序数据元素的有限集合。排排序序码码(key):通通常常数数据据元元素素有有多多个个属属性性域域,即即多多个个数数据据成成员员组组成成,其其中中有有一一个个属属性性域域可可用用来来区区分分元元素素,作作为为排排序序依依据据。该该域域即即为为排排序序码码。每每个个数数据据表表用用哪哪
2、个个属属性性域域作作为为排排序序码码,要要视视具具体体的的应应用用需需要要而而定。定。2排序算法的稳定性排序算法的稳定性:如果在元素序列中有两如果在元素序列中有两 个元个元素素ri和和rj,它们的排序码它们的排序码 ki=kj,且在排序之且在排序之前前,元素元素ri排在排在rj前面。如果在排序之后前面。如果在排序之后,元素元素ri仍在元素仍在元素rj的前面的前面,则称这个排序方法是则称这个排序方法是稳定稳定的的,否则称这个排序方法是不稳定的。否则称这个排序方法是不稳定的。内排序与外排序内排序与外排序:内排序内排序是指在排序期间数据元是指在排序期间数据元素全部存放在素全部存放在内存内存的排序;的
3、排序;外排序外排序是指在排序期是指在排序期间全部元素个数太多,不能同时存放在内存,必间全部元素个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在须根据排序过程的要求,不断在内、外存内、外存之间移之间移动的排序。动的排序。3排序的时间开销排序的时间开销:排序的时间开销是衡量算法好排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执坏的最重要的标志。排序的时间开销可用算法执行中的行中的数据比较次数数据比较次数与与数据移动次数数据移动次数来衡量。来衡量。算法运行时间代价的大略估算算法运行时间代价的大略估算一般一般都都按平均情况按平均情况进行估算。对于那些受元素排序码序列进行
4、估算。对于那些受元素排序码序列初始排列初始排列及及元素个数元素个数影响较大的算法,需要按影响较大的算法,需要按最好最好情况和情况和最坏最坏情况进行估算。情况进行估算。算法执行时所需的附加存储算法执行时所需的附加存储:评价算法好坏的另评价算法好坏的另一标准。一标准。4待排序数据表的类定义待排序数据表的类定义#include const int DefaultSize=100;template class Element/数据表元素定义public:T key;/排序码 field otherdata;/其他数据成员 Element&operator=(Element&x)key=x.key;ot
5、herdata=x.otherdata;return this;5 bool operator=(Element&x)return key=x.key;/判*this与x相等 bool operator=(Element&x)return key=(Element&x)return key=x.key;/判*this大于或等于x bool operator (Element&x)return key x.key;/判*this大于x bool operator (Element&x)return key x.key;/判*this小于x;6template class dataList/数据表
6、类定义private:Element*Vector;/存储排序元素的向量 int maxSize;/向量中最大元素个数 int currentSize;/当前元素个数public:datalist(int maxSz=DefaultSize):/构造函数 maxSize(maxSz),currentSize(0)Vector=new ElementmaxSize;int Length()return currentSize;/取表长度7 void Swap(Element&x,Element&y)Element temp=x;x=y;y=temp;Element&operator(int i)
7、/取第i个元素 return Vectori;int Partition(const int low,const int high);/快速排序划分;8插入排序插入排序 (Insert Sorting)(Insert Sorting)基本方法是:每步将一个待排序的元素,按其排序基本方法是:每步将一个待排序的元素,按其排序码大小,插入到前面已经排好序的一组元素的适当码大小,插入到前面已经排好序的一组元素的适当位置上位置上,直到元素全部插入为止。直到元素全部插入为止。直接插入排序直接插入排序折半插入排序折半插入排序希尔排序希尔排序9基本思想是基本思想是:当插入第当插入第i(i1)个元素时,前面的个
8、元素时,前面的V0,V1,Vi-1已经排好序。这时,用已经排好序。这时,用Vi的排序码与的排序码与Vi-1,Vi-2,的排序码顺序进行比较,找到插入位置即的排序码顺序进行比较,找到插入位置即将将Vi插入,原来位置上的元素向后顺移。插入,原来位置上的元素向后顺移。10直接插入排序直接插入排序 (Insert Sort)(Insert Sort)11各各趟趟排排序序结结果果21212525494925*25*161608080 1 2 3 4 50 1 2 3 4 5 temp212125494925*25*161608082525i=10 1 2 3 4 5 temp212125254925*2
9、5*161608084949i=2120 1 2 3 4 5i=4i=5i=30 1 2 3 4 5 temp21212525494925*25*160808161621212525494925*1616080825*25*0 1 2 3 4 5 temp21212525494925*25*16160808080 1 2 3 4 5 temp1321212525494925*25*161608080 1 2 3 4 5i=4 时的排序过程时的排序过程完成1616160 1 2 3 4 5 temp21212525494925*25*080816164916160 1 2 3 4 5 temp2
10、1212525494925*25*08081616i=4j=3i=4j=2142516160 1 2 3 4 5 temp2121494925*25*08081616252525*161621212525494925*25*08080 1 2 3 4 51616i=4j=1i=4j=0i=4j=-10 1 2 3 4 5 temp212525494925*25*0808161621211616直接插入排序的算法直接插入排序的算法#include dataList.htemplate void InsertSort(dataList&L,int left,int right)/依次将元素L.Ve
11、ctori按其排序码插入到有序表/L.Vectorleft,L.Vectori-1中,使得/L.Vectorleft到L.Vectori有序。Element temp;int i,j;for(i=left+1;i=right;i+)if(Li=left&temp Lj);Lj+1=temp;16设待排序元素个数为设待排序元素个数为currentSize=n,则该算法的主程序执则该算法的主程序执行行n-1趟。排序码趟。排序码比较次数比较次数和和元素移动次数元素移动次数与元素排序码与元素排序码的初始排列有关。的初始排列有关。最好情况下最好情况下,排序前元素已按排序码从小到大有序,每趟,排序前元素已
12、按排序码从小到大有序,每趟只需与前面有序元素序列的最后一个元素比较只需与前面有序元素序列的最后一个元素比较1次,总的次,总的排序码比较次数为排序码比较次数为 n-1,元素移动次数为元素移动次数为0。最最坏坏情情况况下下,第第 i 趟趟时时第第 i 个个元元素素必必须须与与前前面面 i 个个元元素素都都做做排排序序码码比比较较,并并且且每每做做1次次比比较较就就要要做做1次次数数据据移移动动。则则总总排序码比较次数排序码比较次数KCN和和元素移动次数元素移动次数RMN分别为分别为平均情况下平均情况下,排序的时间复杂度为,排序的时间复杂度为 O(n2)。直接插入排序是一种直接插入排序是一种稳定稳定
13、的排序方法。的排序方法。17折半插入排序折半插入排序 (Binary Insert Sort)(Binary Insert Sort)基本思想是基本思想是:设在顺序表中有一设在顺序表中有一 个元素序列个元素序列 V0,V1,Vn-1。其中。其中,V0,V1,Vi-1 是已经排好序是已经排好序的元素。在插入的元素。在插入Vi 时时,利用利用折半搜索法折半搜索法寻找寻找Vi 的插入位置。的插入位置。18 折半插入排序的折半插入排序的算法算法#include dataList.h template void BinaryInsertSort(dataList&L,const int left,con
14、st int right)/利用折半搜索,在L.Vectorleft到L.Vectori-1中/查找L.Vectori应插入的位置,再进行插入。Element temp;int i,low,high,middle,k;for(i=left+1;i=right;i+)temp=Li;low=left;high=i-1;while(low=high)/折半搜索寻找插入位置 middle=(low+high)/2;/取中点19 if(temp=low;k-)Lk+1=Lk;/成块移动,空出插入位置 Llow=temp;/插入 ;20 就就平均性能平均性能来说,来说,折半搜索比顺序搜索快折半搜索比顺序
15、搜索快,所以折所以折半插入排序半插入排序比直接插入排序比直接插入排序平均性能平均性能要快。要快。它所需的它所需的排序码比较次数与待排序元素序列的初排序码比较次数与待排序元素序列的初始排列无关始排列无关,仅依赖于元素个数。在插入第,仅依赖于元素个数。在插入第 i 个个元素时,需要经过元素时,需要经过 log2i +1 次排序码比较次排序码比较,才能才能确定它应插入的位置。因此,将确定它应插入的位置。因此,将 n 个元素个元素(为推导为推导方便方便,设为设为 n=2k)用折半插入排序所进行的排序码用折半插入排序所进行的排序码比较次数为:比较次数为:折半插入排序是一种折半插入排序是一种稳定稳定的排序
16、方法。的排序方法。21当当 n 较较大大时时,总总排排序序码码比比较较次次数数比比直直接接插插入入排排序序的最坏情况要好得多,但比其最好情况要差。的最坏情况要好得多,但比其最好情况要差。在在元元素素的的初初始始排排列列已已经经按按排排序序码码排排好好序序或或接接近近有有序序时时,直直接接插插入入排排序序比比折折半半插插入入排排序序执执行行的的排排序序码码比较次数比较次数要少。要少。折折半半插插入入排排序序的的元元素素移移动动次次数数与与直直接接插插入入排排序序都都依赖于元素的初始排列。依赖于元素的初始排列。22希尔排序希尔排序 (Shell Sort)(Shell Sort)希尔排序方法又称为
17、希尔排序方法又称为缩小增量排序缩小增量排序。该方法的基。该方法的基本思想是本思想是:设待排序元素序列有设待排序元素序列有 n 个元素个元素,首先取一个整数首先取一个整数 gap n 作为间隔,将全部元素分为作为间隔,将全部元素分为 gap 个子序列,个子序列,所有距离为所有距离为 gap 的元素放在同一个子序列中,在的元素放在同一个子序列中,在每一个子序列中分别施行直接插入排序。然后缩每一个子序列中分别施行直接插入排序。然后缩小间隔小间隔 gap,例如取例如取 gap=gap/2,重复上述的子,重复上述的子序列划分和排序工作。直到最后取序列划分和排序工作。直到最后取 gap=1,将所,将所有元
18、素放在同一个序列中排序为止。有元素放在同一个序列中排序为止。23 开始时开始时 gap 的值较大,子序列中的元素较少,排的值较大,子序列中的元素较少,排序速度较快序速度较快;随着排序进展,随着排序进展,gap 值逐渐变小值逐渐变小,子子序列中元素个数逐渐变多,由于前面工作的基础,序列中元素个数逐渐变多,由于前面工作的基础,大多数元素已基本有序,所以排序速度仍然很快。大多数元素已基本有序,所以排序速度仍然很快。242521212525494925*25*161608080 1 2 3 4 5212125*25*i=108084949Gap=325251616492516084925*082125
19、2125*162621212525494925*25*161608080 1 2 3 4 52121i=208084949Gap=225251616491625*082125494925*25*08081616212125*25*25252721212525494925*25*161608080 1 2 3 4 52121i=30808Gap=125251616494925*25*#include#include dataList.htemplate class template void ShellSort(dataList&L,const int left,const int right)
20、int i,j,gap=right-left+1;/增量的初始值Element temp;do gap=gap/3+1;/求下一增量值 for(i=left+gap;i=right;i+)if(Li=left&temp 1);29gap的取法有多种。最初的取法有多种。最初 Shell 提出取提出取 gap=n/2,gap=gap/2,直到,直到gap=1。Knuth 提出取提出取 gap=gap/3 +1。还有人提出都取奇数为好,也有人提出各。还有人提出都取奇数为好,也有人提出各 gap 互质互质为好。为好。对特定的待排序元素序列,可以准确地估算排序码的比对特定的待排序元素序列,可以准确地估算
21、排序码的比较次数和元素移动次数。较次数和元素移动次数。想想要要弄弄清清排排序序码码比比较较次次数数和和元元素素移移动动次次数数与与增增量量选选择择之之间间的的依依赖赖关关系系,并并给给出出完完整整的的数数学学分分析析,还还没没有有人人能能够够做到。做到。Knuth利利用用大大量量实实验验统统计计资资料料得得出出:当当 n 很很大大时时,排排序序码码平平均均比比较较次次数数和和元元素素平平均均移移动动次次数数大大约约在在 n1.25 到到 1.6n1.25 的的范范围围内内。这这是是在在利利用用直直接接插插入入排排序序作作为为子子序序列列排序方法的情况下得到的。排序方法的情况下得到的。希尔排序是
22、一种希尔排序是一种不稳定不稳定的排序方法。的排序方法。30快速排序快速排序 (Quick Sort)(Quick Sort)基本思想是基本思想是:任取待排序元素序列中的某个元素任取待排序元素序列中的某个元素(例如取第例如取第一个元素一个元素)作为作为基准基准,按照该元素的排序码大小,按照该元素的排序码大小,将整个元素序列划分为左右两个子序列:将整个元素序列划分为左右两个子序列:u左侧左侧子序列中所有元素的排序码都子序列中所有元素的排序码都小于或等小于或等于于基准元素的排序码基准元素的排序码 u右侧右侧子序列中所有元素的排序码都子序列中所有元素的排序码都大于大于基准基准元素的排序码元素的排序码3
23、1基准元素则排在这两个子序列中间基准元素则排在这两个子序列中间(这也是该这也是该元素最终应安放的位置元素最终应安放的位置)。然后分别对这两个子序列重复施行上述方法,然后分别对这两个子序列重复施行上述方法,直到所有的元素都排在相应位置上为止。直到所有的元素都排在相应位置上为止。3233QuickSort(List)if(List的长度大于的长度大于1)将序列将序列List划分为两个子序列划分为两个子序列 LeftList 和和 RightList;QuickSort(LeftList);QuickSort(RightList);将两个子序列将两个子序列 LeftList 和和 RightList
24、 合并为一个序列合并为一个序列List;算法描述算法描述3421212525494925*25*161608080 1 2 3 4 5212125*25*k=1=1494925*25*16162525161608084949pivotpivot0808252549492121k=2=2k=3=308081616252525*25*2121pivotpivotpivotpivotpivotpivot3521212525494925*25*161608080 1 2 3 4 525*25*k=1=1划分划分划分划分252516162525161608084949pivotpospivotpos08
25、0825*25*49490808161625*25*25252121pivotpospivotpos2121比较比较比较比较4 4次次次次交换交换交换交换25,1625,16i ii ipivotpospivotpos2121比较比较比较比较1 1次次次次交换交换交换交换49,0849,084949low pivotposlow pivotpos交换交换交换交换21,0821,08快速排序的算法快速排序的算法#include dataList.htemplate void QuickSort(dataList&L,const int left,const int right)/对元素Vecto
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 排序
限制150内