第十章内部排序.ppt
《第十章内部排序.ppt》由会员分享,可在线阅读,更多相关《第十章内部排序.ppt(105页珍藏版)》请在三一办公上搜索。
1、1,第十章 内部排序,1、概述2、插入排序3、交换排序4、选择排序5、归并排序6、基数排序,2,排序的分类:内部排序:全部记录都可以同时调入内存进行的排序。外部排序:文件中的记录太多,无法全部将其同时调入内存进行的排序。,1、概述,3,定义:设有记录序列:R1、R2.Rn 其相应的关键字序列为:K1、K2.Kn;若存在一种确定的关系:Kx=Ky=Kz 则将记录序列 R1、R2.Rn 排成按该关键字有序的 序列 Rx、Ry.Rz 的操作,称之为排序。关系是任意的,如通常使用的小于、大于等关系。稳定与不稳定:若记录序列中的任意两个记录 Rx、Ry 的关键字 Kx=Ky;如果在排序之前和排序之后,它
2、们的相对位置保持不变,则这种排序方法是稳定的,否则是不稳定的。,4,define MAXSIZE 20typedef int KeyType;typedef struct KeyType key;InfoType otherinfo;RedType;,typedef struct RedType r MAXSIZE+1;/r0 空或作哨兵 int length;SqList;,5,r0 用作哨兵。共执行 5 遍操作。每遍操作:先将元素复制内容放入r0,再将本元素同已排序的序列,从尾开始进行比较。在已排序的序列中寻找自己的位置,进行插入。或者寻找不到,则一直进行到哨兵为止。意味着本元素最小,应该
3、放在 r1。每一遍,排序的序列将增加一个元素。如果序列中有 n 个元素,那么最多进行n 遍即可。,2、插入排序,例:36、24、10、6、12存放在 r 数组的下标为 1 至 5 的元素之中,用直接插入法将其排序。结果仍保存在下标为 1 至 5 的元素之中。,直接插入排序,6,0,1,2,36,24,10,6,12,3,4,5,36,24,24,7,0,1,2,36,24,10,6,12,3,4,5,36,24,8,0,1,2,36,24,10,6,12,3,4,5,36,24,24,9,0,1,2,36,24,10,6,12,3,4,5,36,10,24,10,10,0,1,2,36,24,
4、10,6,12,3,4,5,36,10,24,11,0,1,2,36,24,10,6,12,3,4,5,36,10,24,12,0,1,2,36,24,10,6,12,3,4,5,36,10,24,10,13,0,1,2,36,24,10,6,12,3,4,5,36,24,6,10,6,14,0,1,2,36,24,10,6,12,3,4,5,36,24,6,10,15,0,1,2,36,24,10,6,12,3,4,5,36,24,6,10,16,0,1,2,36,24,10,6,12,3,4,5,36,24,6,10,17,0,1,2,36,24,10,6,12,3,4,5,36,24,6
5、,10,6,18,0,1,2,36,24,10,6,3,4,5,36,24,12,10,6,12,12,19,0,1,2,36,24,10,6,3,4,5,36,24,12,10,6,12,20,0,1,2,36,24,10,6,3,4,5,36,24,12,10,6,12,21,22,直接插入排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。,算法描述:,23,void straisort(JD r,int n)int i,j;for(i=2;i=n;i+)r0=ri;j=i-1;while(r0.keyr
6、j.key)rj+1=rj;j-;rj+1=r0;,typedef struct int key;float info;JD;,24,例,49 38 65 97 76 13 27,i=2 38(38 49)65 97 76 13 27,i=3 65(38 49 65)97 76 13 27,i=4 97(38 49 65 97)76 13 27,i=5 76(38 49 65 76 97)13 27,i=6 13(13 38 49 65 76 97)27,i=1(),i=7(13 38 49 65 76 97)27,27,97,76,65,49,38,27,0 1 2 3 4 5 6 7,25
7、,算法评价时间复杂度若待排序记录按关键字从小到大排列(正序)关键字比较次数:,记录移动次数:,0 1 2 3 4 5 6 7,13 27 38 49 65 76 97,26,若待排序记录按关键字从大到小排列(逆序)关键字比较次数:,记录移动次数:,0 1 2 3 4 5 6 7,97 76 65 49 38 27 13,27,若待排序记录是随机的,取平均值关键字比较次数:,记录移动次数:,T(n)=O(n),空间复杂度:S(n)=O(1),28,折半插入排序排序过程:用折半查找方法确定插入位置的排序叫。,例,i=1(30)13 70 85 39 42 6 20,i=2 13(13 30)70
8、85 39 42 6 20,i=7 6(6 13 30 39 42 70 85)20,.,i=8 20(6 13 20 30 39 42 70 85),29,void binsort(JD r,int n)int i,j,x,s,m,k;for(i=2;i=n;i+)r0=ri;x=ri.key;s=1;j=i-1;while(s=j)m=(s+j)/2;if(xrm.key)j=m-1;else s=m+1;,for(k=i-1;k=s;k-)rk+1=rk;rs=r0;,30,算法描述:,算法评价时间复杂度:T(n)=O(n)空间复杂度:S(n)=O(1),31,希尔排序(缩小增量法)排序
9、过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。,32,33,#define T 3int d=5,3,1;/最后一个元素必为1void shellsort(JD r,int n,int dT)int i,j,k;JD x;/中间变量 for(k=0;kT;k+)/T等于几,进行几趟shell排序 for(i=dk+1;i=n;i+)x=ri;j=i-dk;/直接插入排序法j=i-1,34,while(j0)/直接插入排序法?,35,算法描述,#define T 3int d=5
10、,3,1;,49,13,38,27,27,4,55,38,65,48,97,55,76,4,1 2 3 4 5 6 7 8 9 10,1 2 3 4 5 6 7 8 9 10,1 2 3 4 5 6 7 8 9 10,最后一趟希尔排序与直接插入排序相同,36,希尔排序特点子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列希尔排序可提高排序速度,因为分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体上看是减小了关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序增量序列取法没有除1以外的公因子最后一个增量值必须为1,37,3、交换排
11、序冒泡排序排序过程将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止,38,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38
12、,30,38,1 2 3 4 5 6 7 8,39,void bubble_sort(JD r,int n)int m,i,j,flag=1;JD x;m=n-1;while(m0)j+),if(rj.keyrj+1.key)flag=1;x=rj;rj=rj+1;rj+1=x;m-;,40,算法描述:,算法评价时间复杂度最好情况(正序)比较次数:n-1移动次数:0最坏情况(逆序)比较次数:,移动次数:,空间复杂度:S(n)=O(1),T(n)=O(n),41,快速排序基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记
13、录进行排序,以达到整个序列有序。,42,排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key初始时令i=s,j=t首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换重复上述两步,直至i=j为止再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止,43,完成一趟排序:(27 38 13)49(76 97 65 50),分别进行快速排序:(13)27(38)49(50 65)76(97),快速排序结束:13 27 38 49 50 65 76 97,49,27,
14、49,65,13,49,49,97,44,void qksort(JD r,int t,int w)int i,j,k;JD x;if(t=w)return;i=t;j=w;x=ri;while(i=x.key)j-;if(ij)ri=rj;i+;while(ij),ri=x;qksort(r,t,j-1);qksort(r,j+1,w);,45,x.key=49,完成一趟排序:(27 38 13)49(76 97 65 50),27,65,13,49,97,算法描述:,46,算法评价时间复杂度最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)最坏情况(每次总是选到最小或最大元素
15、作枢轴)T(n)=O(n),空间复杂度:需栈空间以实现递归最坏情况:S(n)=O(n)一般情况:S(n)=O(log2n),T(n)=O(n),47,课外学习,看书 P263277题集 10.1(1)(2)(3)补充题:写出希尔排序的算法写出快速排序的算法,48,4、选择排序(Selection Sort)简单选择排序(Simple Selection Sort)排序过程首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换;再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换;重复上述操作,共进行n-1趟排序后,排序结束。,49,例
16、,初始:49 38 65 97 76 13 27,i=1,13,49,一趟:13 38 65 97 76 49 27,i=2,27,38,六趟:13 27 38 49 65 76 97,排序结束:13 27 38 49 65 76 97,50,void smp_selesort(JD r,int n)int i,j,k;JD x;for(i=1;in;i+)/n-1趟比较 k=i;for(j=i+1;j=n;j+)/每趟比较次数为n-i 次 if(rj.keyrk.key)k=j;,if(i!=k)/交换 x=ri;ri=rk;rk=x;,算法描述,51,算法评价时间复杂度记录移动次数最好情况
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十 内部 排序

链接地址:https://www.31ppt.com/p-4723419.html