第7章 排序精选文档.ppt
《第7章 排序精选文档.ppt》由会员分享,可在线阅读,更多相关《第7章 排序精选文档.ppt(115页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 排序本讲稿第一页,共一百一十五页第七章第七章 排序排序7.4 7.4 7.4 7.4 归并排序归并排序归并排序归并排序 一一.归并排序的概念归并排序的概念 二二.相邻有序子表的归并相邻有序子表的归并 三三.二路归并排序的实现二路归并排序的实现7.5 7.5 7.5 7.5 分配排序分配排序分配排序分配排序 一一.多关键字排序多关键字排序 二二.基数排序基数排序7.6 7.6 7.6 7.6 内排序方法比较内排序方法比较内排序方法比较内排序方法比较 一一.几种内部排序方法的性能几种内部排序方法的性能 二二.比较分析比较分析 三三.方法选择方法选择本讲稿第二页,共一百一十五页第七章第七章
2、排序排序7.7 7.7 7.7 7.7 拓扑分类的实现拓扑分类的实现拓扑分类的实现拓扑分类的实现 一一.基本思路基本思路 二二.实现步骤实现步骤 三三.算法描述算法描述7.8 7.8 外排序简介外排序简介外排序简介外排序简介 一一.外排序的基本步骤外排序的基本步骤 二二.外排序的时间开销外排序的时间开销 三三.败者树与最佳归并树败者树与最佳归并树本讲稿第三页,共一百一十五页第七章第七章第七章第七章 排排排排 序序序序 排序排序排序排序(sorting)(sorting)用某种方法,把元素的无序序列调整为按某用某种方法,把元素的无序序列调整为按某 数据项有序排列的过程;数据项有序排列的过程;数据
3、表数据表数据表数据表 待排序的数据元素的有限集;待排序的数据元素的有限集;有序表有序表有序表有序表 排序后的表;排序后的表;无序表无序表无序表无序表 排序前的表;排序前的表;主关键字主关键字主关键字主关键字 可以唯一标识数据表中各元素的数据项;可以唯一标识数据表中各元素的数据项;排序项排序项排序项排序项 用于排序的数据项;用于排序的数据项;排序码排序码排序码排序码 排序项的值;排序项的值;正序正序正序正序 关键字关键字ki、kj在表中的位置关系符合排序要求;在表中的位置关系符合排序要求;逆序逆序逆序逆序 关键字关键字ki、kj在表中的位置关系不符合排序要求;在表中的位置关系不符合排序要求;本讲
4、稿第四页,共一百一十五页第七章第七章第七章第七章 排排排排 序序序序 排序结果唯一性:排序结果唯一性:排序结果唯一性:排序结果唯一性:若以主关键字为排序项,排序结果唯一若以主关键字为排序项,排序结果唯一 ;否则排序结果不唯一;否则排序结果不唯一;排序方法的稳定性:排序方法的稳定性:排序方法的稳定性:排序方法的稳定性:如果有排序码如果有排序码Ki=Kj,排序前排序前Ki领先于领先于Kj (ilen-1;/f lag 记录一趟比较中最后一次发生交换的位置记录一趟比较中最后一次发生交换的位置 while(f lag0)j=flag-1;flag=0;/j 记下要比较的最后位置,重置记下要比较的最后位
5、置,重置f lag初值初值 for(i=0;ireci.key L-reci+1.key)temp=L-reci;L-reci=L-reci+1;L-reci+1=temp;flag=i;本讲稿第十页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 注意:注意:注意:注意:算法中,算法中,f lag 既是一趟扫描有无交换发生的标记,既是一趟扫描有无交换发生的标记,又是最后一次发生交换的位置记录;又是最后一次发生交换的位置记录;3.3.算法分析:算法分析:算法分析:算法分析:时间复杂度:时间复杂度:时间复杂度:时间复杂度:最坏情况,对无序表扫描最坏情况,对无序表扫
6、描 n-1趟,每次下沉一个趟,每次下沉一个 元素;共进行元素;共进行 n(n-1)/2 次比较,复杂度为次比较,复杂度为O(n2)空间复杂度:空间复杂度:空间复杂度:空间复杂度:in place 动态性能:动态性能:动态性能:动态性能:稳定稳定(在消除逆序过程中没有产生新的逆序在消除逆序过程中没有产生新的逆序);思考:思考:思考:思考:该算法扫描过程中,该算法扫描过程中,该算法扫描过程中,该算法扫描过程中,“大者大者大者大者”下沉速度大于下沉速度大于下沉速度大于下沉速度大于“小者小者小者小者”上浮上浮上浮上浮速度速度速度速度 ;若能加速若能加速若能加速若能加速“上浮上浮上浮上浮”速度,则可提高
7、效率。如何改进?速度,则可提高效率。如何改进?速度,则可提高效率。如何改进?速度,则可提高效率。如何改进?本讲稿第十一页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 二二二二.快速排序快速排序快速排序快速排序 快速排序快速排序(Quick Sort)冒泡排序的改进冒泡排序的改进 基本思想:基本思想:基本思想:基本思想:分治法分治法分治法分治法 大的待排序表大的待排序表大的待排序表大的待排序表 小的待排序表小的待排序表小的待排序表小的待排序表 更小的待排序表更小的待排序表更小的待排序表更小的待排序表 2 2个个个个(或或1 1个个)元素排序。元素排序。元素排序
8、。元素排序。实现方法:实现方法:实现方法:实现方法:通过一趟排序把待排序表分成前后两部分,使通过一趟排序把待排序表分成前后两部分,使 前一部分元素的排序码前一部分元素的排序码 后一部分元素的排序码后一部分元素的排序码 ;再对每部分元素以同样方法进行排序,直到全表元素再对每部分元素以同样方法进行排序,直到全表元素 按排序码有序;按排序码有序;关键:关键:关键:关键:如何把待排序表分为符合上述要求的两部分如何把待排序表分为符合上述要求的两部分 线性表分割;线性表分割;本讲稿第十二页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 1.1.线性表分割线性表分割线性表分
9、割线性表分割 设待排序记录为设待排序记录为R0,Rn-1。一趟一趟(非递减非递减)排序的分割过程为:排序的分割过程为:设置指针设置指针i、j分别指向待排序表的第一个和最后一个元素;分别指向待排序表的第一个和最后一个元素;选取一个元素选取一个元素Rk,做:做:Rk T,Ri Rk;逐渐减小逐渐减小j,同时依次比较同时依次比较 Rj.key与与 T.key,直到直到 Rj.key T.key时,把时,把 Ri移到移到 Rj的位置上,的位置上,即:即:Ri Rj;反复做反复做、,直到直到 i=j为止,此时令为止,此时令 Ri=T。本讲稿第十三页,共一百一十五页7.1 7.1 7.1 7.1 交换排序
10、交换排序交换排序交换排序 T(T=Rk)ij.TiijjR1,R0,Rn-2,Rn-1jiR0,R1,Rn-2,Rn-1jiR0,R1,Rk,Rn-2,Rn-1本讲稿第十四页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 例,分割无序表例,分割无序表(65 38 49 97 76 13 27 44),取取 Rk=49 T65389776132744386597761327444438659776132744389776132765443827977613654438277613976544382713769765443827134949769765iiiiii
11、iijjjjjjjj本讲稿第十五页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 线性分割算法线性分割算法线性分割算法线性分割算法:int Partition(RecType R,int low,int high)/对记录子序列对记录子序列 R low,high 进行分割,返回分割点位置进行分割,返回分割点位置 选取表中元素选取表中元素Rk,k low,high int i,j;RecType T;T=Rk;Rk=Rlow;/low 位置空位置空 i=low;j=high;/i、j分别指向待排序表的头、尾元素分别指向待排序表的头、尾元素 while(i!=j)
12、/i、j 相遇时本趟分割完成相遇时本趟分割完成 /j 向前移动,直到向前移动,直到j 所指示的关键字值所指示的关键字值=T.key&i j)j-;本讲稿第十六页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 if(i j)/j 指示的关键字指示的关键字 T的关键字的关键字 while(Ri.key=T.key&i j)i+;if(i T的关键字的关键字 Rj=Ri;j-;/i 指示的元素交换到指示的元素交换到 j 的位置的位置 Ri=T;/T 放入分割点放入分割点 i 的位置的位置 return i ;/返回本趟的分割点返回本趟的分割点 i 本讲稿第十七页,共
13、一百一十五页m n7.1 7.1 交换排序交换排序 2.2.快速排序算法快速排序算法快速排序算法快速排序算法 从快速排序的步骤可以看出,快速排序的过程即是从快速排序的步骤可以看出,快速排序的过程即是 对无序表逐层分割的过程,可以递归实现;对无序表逐层分割的过程,可以递归实现;如图:如图:i-1 i i+1m i n递归过程的边界递归过程的边界递归过程的边界递归过程的边界排序的最小子表排序的最小子表表中多于一个元素表中多于一个元素 即:表起始位置即:表起始位置 m)/表长不小于表长不小于 2 i=partition(L-rec,m,n);/分割表分割表 L中元素中元素 Qksort(L,m,i-
14、1);/对前半部分做快速排序对前半部分做快速排序 Qksort(L,i+1,n);/对后半部分做快速排序对后半部分做快速排序 本讲稿第十九页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 3.3.算法分析算法分析算法分析算法分析 关于关于Rk的选取的选取 Rk直接关系到排序的时间效率:直接关系到排序的时间效率:若若Rk.key为表中最小或最大关键字项,效率最低为表中最小或最大关键字项,效率最低 (每一趟排序只确定一个元素的位置每一趟排序只确定一个元素的位置);复杂度:复杂度:O(n2)若若Rk平分线性表,效率最高;平分线性表,效率最高;复杂度:复杂度:O(n
15、log2n)实用中采取:实用中采取:选取选取Rm、R 、Rn关键字值的中项位置为关键字值的中项位置为 k;在在m、n之间产生随机数之间产生随机数k(每个子表每个子表k不同不同);空间复杂度:空间复杂度:空间复杂度:空间复杂度:平均平均 O(log2n),最坏情况最坏情况O(n):时间复杂度:时间复杂度:时间复杂度:时间复杂度:平均平均 O(n log2n),最坏情况:最坏情况:O(n2)动态性能:动态性能:不稳定不稳定不稳定不稳定m+n2适用于大表的排序适用于大表的排序适用于大表的排序适用于大表的排序本讲稿第二十页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序
16、4.4.4.4.快速排序的非递归算法快速排序的非递归算法快速排序的非递归算法快速排序的非递归算法思路:思路:思路:思路:设置一个栈设置一个栈S,在逐层分割过程中,总是对前一在逐层分割过程中,总是对前一(或后一个或后一个)子表子表进行再分割,同时把暂不分割的另一子表起始位置和终止位置压进行再分割,同时把暂不分割的另一子表起始位置和终止位置压栈保存;当前一栈保存;当前一(或后一个或后一个)子表分割完成时,从栈顶弹出另一子子表分割完成时,从栈顶弹出另一子表进行同样分割,以此类推,至栈空,排序完成。表进行同样分割,以此类推,至栈空,排序完成。若待排序记录序列为若待排序记录序列为Rk,m;设第一层分割点
17、位置为设第一层分割点位置为i,第二层分割点位置为第二层分割点位置为 i,则栈则栈S中内容为:中内容为:i-1 i+1k i m i+1mi+1mk i m本讲稿第二十一页,共一百一十五页7.1 7.1 7.1 7.1 交换排序交换排序交换排序交换排序 算法描述:算法描述:算法描述:算法描述:QkSort1(SqList*L,int m,int n)int i,j,k;SqStack S;InitStack(S,20);/栈栈S中整型元素有两个分量中整型元素有两个分量 Push(S,m,n);/表元素起始位置表元素起始位置 m 和终点位置和终点位置n 压栈压栈 while(!EmptyStack
18、(s)/栈不空重复做分割栈不空重复做分割 Pop(S,k,j);/弹出待分割子表起始点到弹出待分割子表起始点到 k,终点到终点到 j while(krec,k,j);/分割子表分割子表L.reckL.recj Push(S,i+1,j);/被分割子表的后半部分压栈被分割子表的后半部分压栈 j=i-1;/准备对子表前半部继续做分割准备对子表前半部继续做分割 本讲稿第二十二页,共一百一十五页7.2 7.2 7.2 7.2 插入排序插入排序插入排序插入排序 一一一一.直接插入排序直接插入排序直接插入排序直接插入排序(straight insertion sort)简单排序方法简单排序方法简单排序方法
19、简单排序方法 基本思想:基本思想:基本思想:基本思想:将无序表中的元素逐个插入到已经有序的表中;将无序表中的元素逐个插入到已经有序的表中;问题:问题:问题:问题:初始的有序表从何而来?初始的有序表从何而来?解决:解决:解决:解决:无序表中的第一个元素,作为初始有序表中的元素;无序表中的第一个元素,作为初始有序表中的元素;1.1.实现过程实现过程实现过程实现过程 把全表看成两部分把全表看成两部分(两个子表两个子表),前部为有序前部为有序(有序子表有序子表),后部为无序的待排序子表;后部为无序的待排序子表;从有序子表最后一个元素开始,由后向前,将无序子表第一从有序子表最后一个元素开始,由后向前,将
20、无序子表第一 个元素个元素Rj依次与有序子表的元素依次与有序子表的元素进行比较,若有序子表元素进行比较,若有序子表元素 的关键字的关键字Rj的关键字,将该元素向后移动一个位置;直到的关键字,将该元素向后移动一个位置;直到 找到找到Rj的位置,将的位置,将Rj插入到有序子表;插入到有序子表;全表所有元素插入完,排序完成;全表所有元素插入完,排序完成;本讲稿第二十三页,共一百一十五页7.2 7.2 7.2 7.2 插入排序插入排序插入排序插入排序 例:对无序表例:对无序表(49 38 65 97 76 13 27 44)做直接插入排序,过程如下:做直接插入排序,过程如下:(4949)(386597
21、76132744)起始状态起始状态 排序完成排序完成 (13 27(13 27 38 38 44 44 49 65 76 97)49 65 76 97)(13 (13 2727 38 38 49 65 76 49 65 76 97)97)(44)(13 13 38 49 38 49 65 76 97)65 76 97)(27 44)(38 49 65(38 49 65 76 76 97)97)(13 27 44)(38 49(38 49 65 65 9797)(76 13 27 44)(38 49(38 49 6565)(97 76 13 27 44)(38 38 49)49)(65 97 7
22、6 13 27 44)本讲稿第二十四页,共一百一十五页7.2 7.2 7.2 7.2 插入排序插入排序插入排序插入排序 2.2.算法描述算法描述算法描述算法描述 void InsertSort(SqList*L)int i,j;RecType T;for(j=1;jlen;j+)/需要做需要做 len-1 次插入次插入 T=L-recj;/暂存无序子表的第一个元素暂存无序子表的第一个元素(待插入元素待插入元素)i=j-1;/i 指向有序子表的最后位置指向有序子表的最后位置 while(i=0&L-reci-key T.key)/查找待插入元素位置查找待插入元素位置 L-reci+1=L-rec
23、i;i-;L-reci+1=T;/把待插入元素插入到有序表中把待插入元素插入到有序表中 本讲稿第二十五页,共一百一十五页7.2 7.2 7.2 7.2 插入排序插入排序插入排序插入排序 3.3.算法分析算法分析算法分析算法分析 算法特点:算法特点:算法特点:算法特点:查找插入位置与有序子表中元素的移动同时做;查找插入位置与有序子表中元素的移动同时做;时间复杂度:时间复杂度:时间复杂度:时间复杂度:最好情况:最好情况:n-1次比较次比较,2(n-1)次移动,次移动,O(n)最坏情况:最坏情况:次比较次比较,次移动次移动 平均情况:平均情况:次比较次比较,次移动次移动 空间复杂度:空间复杂度:空间
24、复杂度:空间复杂度:in place 动态性能:动态性能:动态性能:动态性能:稳定稳定 适合:适合:适合:适合:表不大表不大(n小小);表基本有序表基本有序(逆序个数少,每个逆序之间距离短逆序个数少,每个逆序之间距离短);n(n-1)2n2+n-24n2+7n-84n2+3n-42O(n2)思考:思考:思考:思考:链表的线性插入排序算法链表的线性插入排序算法链表的线性插入排序算法链表的线性插入排序算法?本讲稿第二十六页,共一百一十五页7.2 7.2 7.2 7.2 插入排序插入排序插入排序插入排序 二二二二.对分插入排序对分插入排序对分插入排序对分插入排序 直接插入排序的基本操作直接插入排序的
25、基本操作 在有序子表中查找待排序元素在有序子表中查找待排序元素 的插入位置并移动元素;的插入位置并移动元素;有序子表中查找位置时采用对分查找方法有序子表中查找位置时采用对分查找方法 对分插入排序;对分插入排序;1.1.对分插入排序思想对分插入排序思想对分插入排序思想对分插入排序思想 采用对分查找方法找出待排序元素在有序子表中的插入位采用对分查找方法找出待排序元素在有序子表中的插入位 置,并将其插入到有序子表中;置,并将其插入到有序子表中;本讲稿第二十七页,共一百一十五页7.2 7.2 7.2 7.2 插入排序插入排序插入排序插入排序2.2.对分插入排序步骤对分插入排序步骤对分插入排序步骤对分插
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 排序精选文档 排序 精选 文档
限制150内