《数据结构》第10章:排序.ppt
《《数据结构》第10章:排序.ppt》由会员分享,可在线阅读,更多相关《《数据结构》第10章:排序.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、王钢王钢 主编主编清华大学出版社清华大学出版社第10章排序l排序的基本概念l常用内部排序l外部排序直接插入排序直接插入排序是插入排序中最简单的排序方法,假设排序表中有n个记录,存储在一维数组Rn中。直接插入排序的基本思想为:把待排记录按排序码大小插入到已排好序的有序表中。算法10.1直接插入排序算法voidD_InsertSort(ElemtypeR,intn)/对记录序列R1.n作直接插入排序inti;for(i=2;i=n;+i)if(Ri.keyRi-1.key)/小于时,需要Ri-1插入有序表适当位置R0=Ri;/复制为监视哨for(j=i-1;R0.keyRj.key;-j)Rj+1
2、=Rj;/记录后移Rj+1=R0;/插入到正确位置例例10.1设一组关键码为8,3,2,5,9,1,6,按递增的顺序进行排序,则基本过程如图10.1所示:图10.1直接插入排序的过程直接插入排序的算法分析,实现排序的基本操作有两个:(1)比较。(2)移动记录。折半插入排序折半插入排序的基本方法是:用二分查找法将待插入记录在有序表中找到正确的插入位置,然后移动记录,空出插入位置,再进行插入。算法10.2折半查找算法描述voidB_InsertionSort(ElemtypeR,intn)/对记录序列R1.n作折半插入排序inti,low,high,mid;for(i=2;in;+i)R0=Ri;
3、/将Ri暂存到R0low=1;high=n-1;while(low=high)/在Rlow.high序列中寻找折半查找插入的位置m=(low+high)/2;/折半if(R0.key=high+1;-j)/high+1为插入位置Rj+1=Rj;/记录后移Rhigh+1=R0;/插入记录希尔排序(又称缩小增量排序)l希尔排序(Shellssort)又称缩小增量排序,是1959年由D.L.Shell提出来的。希尔排序可以理解为对直接插入排序的一种改进。直接插入排序是从第二个元素开始比较的,循环起始条件为i=2,可以将i=2写成i=1+1,将第一个1用dk代替,即循环初始条件为i=dk+1,dk是一
4、个希尔增量序列,一般可取做dk=5,3,1(当然也可以取其他素数序列,但最后一个必为1),从第i个记录开始,间隔dk的记录为一组,每次用第i个关键字与第Idk个关键字进行比较后做插入排序。例例10.2已知排序表关键字序列为:49,38,65,97,76,13,27,49,55,04,则希尔排序的排序过程如图10.2所示。算法10.3希尔排序算法voidShellInsert(ElemtypeR,intdk)/对R1.n进行一趟插入排序,dk为步长因子inti,j;for(i=dk+1;i=n;i+)/小于1时需将Ri插入有序表if(Ri.key0&R0.keyRj.key;j=j-dk)Rj+
5、dk=Rj;/记录后移Rj+dk=R0;/插入到正确位置voidShellSort(DataTypeR,intn,intd,intt)/按增量序列0,1.t-1对顺序表R1.n作希尔排序for(k=0;kt;k+)ShellInsert(R,dk);一趟增量为dk的插入记录冒泡排序l冒泡排序的基本思想:从第一个元素开始,通过每两个相邻元素的比较,大的记录下沉(后移),同时较小的记录就像“气泡”一样浮到序列前面的位置。一趟冒泡排序后,值最大的记录就排在了序列的最后,二趟排序后,第二大的记录就排在了倒数第二个位置,依此类推,直到把整个记录排完为止,序列就变成有序的了。l需要把每一趟冒泡排序最后一个
6、下沉记录的位置记下,下一遍只检查比较到此为止,到所有记录都不发生下沉时,整个过程结束。所以n个元素实施冒泡排序,共需要n1趟排序,每趟需要ni次比较。算法10.4冒泡排序的基本算法voidBubble_Sort(ElemtypeR,intn)inti,j,flag;for(i=1;in;i+)/共进行n-1趟比较flag=0;for(j=1;jRj+1.key)R0=Rj;/R0作为交换的中间变量Rj=Rj+1;Rj+1=R0;flag=1;if(flag=0)return;/若第一趟过后,没有发生交换,则结束循环快速排序l快速排序是对冒泡排序的一种改进。找一个记录,以它的关键字作为“枢轴”,
7、凡其关键字小于枢轴的记录均移动至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后。致使一趟排序之后,记录的无序序列以该记录关键字为枢轴分割成两部分:枢轴元素左边的所有的关键字值均小于枢轴元素,枢轴元素右边的所有元素值均大于枢轴元素。第二趟再分别对分割成两部分的子序列进行快速排序,依此类推,直到每个待排序列的子序列中只有一个记录时为止,整个排序过程结束。例例10.3对关键码序列43,60,54,17,73,3,1,55实施一趟快速排序,其排序过程如图10.3所示。算法10.5快速排序一次划分算法的描述intPartition(ElemtypeR,intlow,inthigh)/交换记录
8、子序列Rlow.high中的记录,使枢轴记录到位,并返回其所/在位置,此时,在它之前(后)的记录均不大(小)于它R0.key=Rlow.key;/用子表的第一个记录作枢轴记录privotkey=Rlow.key;while(lowhigh)/从表的两端交替地向中间扫描while(low=pivotkey)-high;if(lowhigh)/将比枢轴记录小的记录交换到低端Rlow=Rhigh;low+;while(lowhigh&Rlow.key=pivotkey)+low;if(lowhigh)/将比枢轴记录大的记录交换到高端Rhigh=Rlow;high-;Rlow=R0;/将比枢轴记录到位
9、returnlow;/返回枢轴所在位置/Partition算法10.6快速排序的算法描述voidQSort(ElemtypeR,ints,intt)/对记录序列Rs.t进行快速排序if(st)/长度大于1i=Partition(R,s,t);/将Rs.t一分为二QSort(R,s,i-1);/对低子表递归排序,i是枢轴位置QSort(R,i+1,t);/对高子表递归排序voidQuickSort(ElemtypeR,intn)/对记录序列进行快速排序QSort(R,1,n);简单选择排序l简单选择排序是最简单的一种选择排序。其基本思想是:对有n条记录的关键字序列,第i趟简单选择排序是从关键字序
10、列中第i个记录开始到第n个记录结束的ni+1个记录中选出关键字最小的记录与第i个记录进行交换。(其中i从1到n1共进行n1趟选择排序)例例10.4对数据序列54,32,48,32,60,7,18,40进行简单选择排序,其过程如图10.4所示。图10.4简单选择排序的过程算法10.7简单选择排序算法voidSelect_Sort(ElemtypeR,intn)inti,j,k;for(i=1;in;i+)/做n-1趟选取for(k=i,j=i+1;j=n;j+)/在i开始的n-i+1个记录中选关键字最小的记录if(Rj.keyRk.key)k=j;/k中存放关键字最小的记录的下标if(i!=k)
11、R0=Rk;Rk=Ri;Ri=R0;/交换记录树形选择排序l树形选择排序又称为锦标赛排序,其基本思想是:首先对n个记录的关键字进行两两比较,选出最大的作为子树的根结点。然后在其中n/2个较大的根结点之间再进行两两比较,直到选出最大关键字的记录为止,可以用一棵有n个叶子结点的完全二叉树表示。此时根结点就是排序关键字最大的结点,把选走后的叶设为最小,重新进行比较选择,依此选择下去,直到排序完成。堆排序l设有n个元素的序列k1,k2,kn,当且仅当待排序列关键字满足下述关系之一时,称之为堆堆。如图10.7所示分别为小顶堆和大顶堆的表示和存储结构。(a)堆顶元素取最大值(b)堆顶元素取最小值图10.7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 10 排序
限制150内