数据结构第十章优秀PPT.ppt
《数据结构第十章优秀PPT.ppt》由会员分享,可在线阅读,更多相关《数据结构第十章优秀PPT.ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 概述排序:将一个数据元素(或记录)的随意序列,重新排列成 一个按关键字有序的序列排序稳定性:若有两个关键字相同记录Ri和Rj,排序之前 Ri在Rj之前,排序后仍满足这种次序,这种排序是稳定的内部排序:对内存中数据进行排序内部排序分类:插入排序 交换排序 选择排序 归并排序 计数排序(1)插入排序v干脆插入排序v其它插入排序v希尔排序干脆插入排序:是一种最简洁的排序方法,它的基本操作思想是将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增1的有序表排序过程:将序列分成两部分,一部分已排序,一部分未排序,初始时,已经排序部分只有这个序列第一个元素依次取未排序中的每一个元素,插入到已排
2、序部分恰当位置.例:干脆插入排序干脆插入排序初始关键字 (49)38 65 97 76 13 27 49 i=2 (38)(38 49)65 97 76 13 27 49 i=3 (65)(38 49 65)97 76 13 27 49 i=4 (97)(38 49 65 97)76 13 27 49 i=5 (76)(38 49 65 76 97)13 27 49 i=6 (13)(13 38 49 65 76 97)27 49 i=7 (27)(13 27 38 49 65 76 97)49 i=8 (49)(13 27 38 49 49 65 76 97)干脆插入排序示例Void Ins
3、ertSort(SqList&L)/对依次表L作干脆插入排序 for (i=2;i=L.length;+i)if LT(L.ri.key,L.ri-1.key)L.r0=L.ri;/复制为哨兵 for(j=i-1;LT(L.r0.key,L.rj.key);-j)L.rj+1=L.rj;/记录后移 L.rj+1=L.r0;/插入到正确位置 /InsertSort干脆插入排序算法算法分析干脆插入排序的空间困难度:O(1)时间困难度的分析:1.当待排序序列为正序时:须要进行n-1趟排序,每一趟只要进行一次比较,所以在排序过程中关键字的比较,移动记录的次数为 i=2 n 1,时间困难度为O(n)2.
4、当待排序序列为逆序时:须要进行n-1趟排序,在排序过程中,进行i=2 n(i)=(n+2)(n-1)/2次关键字的比较,记录移动的次数为i=2 n(i+1)=(n+4)(n-1)/2,所以时间困难度为O(n 2)一:折半插入排序 已排序部分本身有序,找插入位置时可以通过折半查找方法来确定插入位置,这样削减了元素比较次数,但没削减元素移动次数算法:Void BinsertSort(Sqlist&L)/对依次表L作折半插入排序 for(i=2;i=L.length;+i)L.r0=L.ri;low=1;high=i-1;其它插入排序其它插入排序 while(low=high+1;-j)Lj+1=L
5、.rj;/记录后移 L.rhigh+1=L.r0;/插入 /for/BinsertSort二:2-路插入排序 在折半插入排序的基础上接着改进,目的是削减排序过程中移动记录的次数,但须要n个记录的协助空间,当l.r1.key是最小(或者最大)时,2-路插入排序就失去了优越性排序过程:原数组为data,开拓一个与data相等空间d将d构成一个循环数组,并设两个指针first和final分别 指向已排序部分第一个元素和最终一个元素将data0赋给d0,以d0将d分成两部分依次处理data1到datan-1 if(dataid0)用折半法将datai插入第一部分 else 用折半法插入其次部分例:Da
6、ta 49 38 65 97 76 13 27 49D D 13 27 38 49 49 65 76 97final49first38firstfinal49final6597first13first4938final762749三:表插入排序(目的是在排序过程中,不须要移动记录)#define SIZE 100 /静态链表容量Typedef struct RcdType rc;/记录项 int next;/指针项 SLNode;/表结点类型Typedef struct SLNode rSIZE;/0号单元为表头结点 int length;/链表当前长度SLinkListType;/静态链表类
7、型 设上述说明为静态链表类型作为待排记录序列的存储结构,为插入便利起见,设数组下标为“0”的重量为表头结点,并令表头结点记录的关键字取最大整数MAXINT则表插入排序过程描述如下:首先将静态链表中数组下标为“1”的重量(结点)和表头结点构成一个循环链表,然后依次将下标为“2”至“n”的分量(结点)按记录关键字非递减插入到循环链表中 具体见p269图10。3 从表插入的基本操作仍是将一个记录插入到已经排好的有序表中。希尔排序思想:先将整个待排记录序列分希尔排序思想:先将整个待排记录序列分割成为若干子序列分别进行干脆插入排割成为若干子序列分别进行干脆插入排序,待整个序列中的记录序,待整个序列中的记
8、录“基本有序基本有序”时,再对全体记录进行一次干脆插入排时,再对全体记录进行一次干脆插入排序序希尔排序特点:子序列的构成不是简洁的希尔排序特点:子序列的构成不是简洁的“逐段分割是将相隔某个逐段分割是将相隔某个“增量增量”的记的记录组成一个子序列录组成一个子序列希尔排序 希尔排序示例初始关键字 49 38 65 97 76 13 27 49 55 04 d1=5 一趟排序结果13 27 49 55 04 49 38 65 97 76 d2=3二趟排序结果13 04 49 38 27 49 55 65 97 76 d3=1三趟排序结果:04 13 27 38 49 49 55 65 76 97Vo
9、id ShellInsert(Sqlist&L,int dk)/对依次表L作一趟希尔插入排序 for(i=dk+1;i0<(L.r0.key,L.rj.key);j-=dk)L.rj+dk=L.rj;L.rj+dk=L.r0;ShellInsert 希尔排序算法 void ShellSort(SqList&L,int dlta,int t)/按递增序列dlta0.t-1对依次表L作希尔排序 for(k=0;kt;+t)ShellInsert(L,dltak);/一趟增量为dltak的插入排序ShellSort10。3起泡排序和快速排序起泡排序思想:依次对未排序部分相邻的两个元素进行比较,若
10、逆序则交换位置,每一趟可以使一个最大(最小)元素从这个序列中冒出来,经过n-1趟,就可以排好序例:起泡排序示例初始关键字 12 23 18 14 4 90第一趟排序后 12 23 18 14 4 90 其次趟排序后 12 18 14 4 23 第三趟排序后 12 14 4 18 第四趟排序后 12 4 14 第五趟排序后 4算法分析起泡排序结束条件为:一趟排序过程中,没有交换记录的操作.分析:1.当待排序序列为正序时:只要一趟排序,在排序过程中,进行n-1次关键字的比较,而且不移动记录,时间困难度为O(n)2.当待排序序列为逆序时:须要进行n-1趟排序,在排序过程中,进行i=2 n(i-1)=
11、n(n-1)/2次关键字的比较,并且作等数量的记录移动,所以时间困难度为O(n 2)快速排序快速排序思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录接着进行快速排序一趟快速排序的过程n1.在待排序序列中随意选择一个记录(通常选择第一个记录)作为枢轴记录L.rs.设枢轴记录的关键字为pivotkeyn2.设low指向待排序序列中的第一个记录,high指向待排序序列中的最终一个记录.n3.先将high向low方向扫描,若l.rhigh.key l.rlow.枢轴记录n4.再将 low向high 方向扫描,若l.rlow.keyp
12、ivotkey,则将 l.rlow=l.rhighn5.重复执行3,4两步,直到low=high时,再将pivotkey的记录=l.rlown到此,待排序序列以pivotkey为界,分成两部分:前一部分的记录关键字比后一部分小.再分别对这两部分进行快速排序例:对下列待排序序列进行快速排序 49l38132749初始关键字hh27 38 65 13 49hl第一次交换之后65l27 38 13 65 49 lh其次次交换之后27 38 13 65 49 第三次交换之后49lh完成一趟排序27 38 1365 49分别再进行快速排序分别再进行快速排序最终得到有序序列13 27 38 49 49 6
13、5算法10.6(a)Int Partition(SqList&L,int low,int high)pivotkey=L.rlow.key;While(lowhigh)while(low=pivotkey)-high;L.rlowL.rhigh;while(lowhigh&L.rlow.key=pivotkey)+low;L.rlowL.rhigh;return low;/返回枢轴记录的位置/Partition快速排序算法实现改写上述算法:将枢轴暂存在r0的位置上,直至一趟排序结束后再将枢轴记录移至正确位置上,算法10.6(b):Int Partition(SqList&L,int low,i
14、nt high)L.r0=L.rlow;Pivotkey=L.rlow.key;while(lowhigh)while(low=pivotkey)-high;L.rlow=L.rhigh;while(lowhigh&L.rlow.key=pivotkey)+low;L.rhigh=L.rlow;L.rlow=L.r0;/枢轴记录到位 return low;/Partition算法10.7 void Qsort(SqList&L,int low,int high)if (lowhigh)pivotloc=Partition(L,low,high);Qsort(L,low,pivotloc-1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第十 优秀 PPT
限制150内