




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章内部排序熟练掌握若干排序方法:插入排序快速排序堆及选择排序归并排序基数排序法;了解最好、最坏、平均排序的时间复杂性分析方法。10.1概述排序(sorting):将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。在许多算法中都要利用到排序。排序的定义:假设含n个记录的序列为{R1,R2,…,Rn
}其相应的关键字序列为{K1,K2,…,Kn
}需确定1,2,…,n的一种排列p1,p2,…,pn,使其相应的关键字满足如下的非递减(或非递增)关系Kp1≤Kp2≤…≤Kpn。即使初始的的序列成为一个按关键字有序的序列{Rp1,Rp2,…,Rpn}这样一种操作称为排序。排序:无序有序性质:稳定排序/不稳定排序分类:内部排序,外部排序内部排序:常用内部排序:插入排序、希尔排序、快速排序、选择排序、堆排序、归并排序、基数排序各种排序平均时间要求:按照算法思想定出排序序列。插入排序的思想:将一个元素插入到一个有序表中。 根据寻找插入位置的方法不同分为:直接插入、折半插入、2路插入、表插入等。直接插入排序:最简单的排序方法思想:将一个元素向一个有序序列插入做法:0位监测哨,从一个元素逐步扩大有序序列。举例10.2插入排序49386597761327490直接插入排序算法:voidInsertSort(SqList&L){//对顺序表L作直接插入排序
for(i=2;i<L.length;++i) if(L.r[i].key<L.r[i-1].key){ L.r[0]=L.r[i]; for(j=i-1;L[0].key<L[j].key;--j) L.r[j+1]=L.r[j]; L.r[j+1]=L.r[0]; }}折半插入排序查找过程用折半查找方法。
voidBInsertSort(SqList&L){for(i=2;i<=L.length;++i){ L.r[0]=L.r[i]; low=1;high=i-1; while(low<=high){ m=(low+high)/2; if(L.r[0].key<L.r[m].key)high=m-1; elselow=m+1; }//while for(j=i-1;j<=high+1;--j)L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; }//for}//BInsertSort493865977613274902-路插入排序减少直接插入法的移动元素的个数,分成2路子有序序列 需要n个记录的辅助空间表插入排序:对静态链表作插入排序。希尔排序:缩小增量排序,属于插入排序算法思想:先将整个待排序记录分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再进行一次全体记录的插入排序。具体操作:49386597761327495504491338276549760413274955044938659776
1355387627046549
4997第一次分组49和13是有缘千里来相会!Yeah!是有规律的,专业的说法是“增量”!这就是第一趟排序结果第二趟的“增量”就要缩小了!Isee希尔排序算法:voidShellInsert(SqList&L,int
dk){//对顺序表L作一趟希尔排序。
for(i=dk+1;i<=L.length;++i) if(L.r[i].key<L.r[i-dk].key){ L.r[0]=L.r[i]; for(j=k-dkl;j>0&L.r[0].key<L.r[j].key;j-=dk) L.r[j+dk]=L.r[j]; L.r[j+dk]=L.r[0]; }}//shelinsertvoidShellSort(SqList&L,int
dlta[],intt){//按增量序列dlta[0..t-1]对顺序表L作希尔排序
for(k=0;k<t;++k)ShellInsert(L,dlta[k]);}10.3快速排序冒泡排序:具体做法:依次比较第i个关键字和第i+1个关键字,大者排后,一趟得到最大值。(i=1,2,3,4,---n-1)493865977613274938496597761327493849657697132749384965761397274938496576132797
4938496576132749
97冒泡排序算法voidBubbleSort(SqList&L){ for(k=L.length-1;k>=1;k--) for(i=0;i<=k-1;k++) if(L.r[i].key>L.r[i+1].key){交换两个记录}}时间复杂度:O(n2)快速排序:思想:一趟排序将序列分成两个部分,前者小于某个值,后者大于某个值。之后再次分别快速排序。4938659776132749lowhigh27386597761349
49lowhigh2738139776496549lowhigh2738499776136549lowhigh273813497697
6549lowhigh4938659776132749lowhigh273865977613
49lowhigh2738139776
6549lowhigh2738
9776136549lowhigh273813
7697
6549lowhigh改进的算法快速排序算法:IntPartition(SqList&L,intlow,inthigh){ L.r[0]=L.r[low];
pivotkey=L.r[low].key; while(low<high){ while(low<high&&L.r[high].key>=pivotkey)--high; L.r[low]=L.r[high]; while(low<high&&L.r[low].key<=pivotkey)++low; L.r[high]=L.r[low]; } L.r[low]=L.r[0]; returnlow;}//平均时间:K为常数因子。就平均时间而言快速排序是目前被认为最好的一种内部排序方法。10.4选择排序选择排序基本思想:每一趟在n-i+1(i=1,2,···,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。简单选择排序:VoidSelectSort(SqList&L){for(i=1;i<L.length;++i){ j=SelectMinKey(L,i);//从L.r[i..L.length]中选择key最小的记录
if(i!=j)L.r[i]L.r[j]; }}堆排序堆的定义:n个元素的序列{k1,k2,,kn}当且仅当满足下列关系时,称为堆:思想:每趟选取最小关键字、次小关键字、次次小关键字---。做法:建立一个完全二叉树,任何非终端结点的值均不大于其左、右孩子结点的值。输出堆顶,将其余的元素建立新的堆。ki≤k2iki≤k2i+1ki≥k2iki≥k2i+1493865977613274997493865271376494949386527137697493865497613279749381349766527974938
134976652797494938132765769749133827657697堆排序算法:voidHeapAdjust(HeaplType&H,ints,intm){//H.r[s..m]中记录的关键字处H.r[s].key外,均为堆,调整,使其成为堆。
rc=H.r[s];for(j=2*s;j<=m;j*=2){ if(j<m&&H.r[j].key<H.r[j+1].key)++j; if(!(rc.key<H.r[j].key))break;H.r[s]=H.r[j];s=j; }//forH.r[s]=rc;}VoidHeapSort(HeapType&H){ for(i=H.length/2;i>0,--i)HeapAdjust(H,I,H.length); for(i=H.length;i>1;--i){H.r[1]↔H.r[i];HeapAdjust(H,1,i-1);}}10.5归并排序思想:将两个或两个以上的有序表组合成一个新的有序表。具体做法:以两路归并示例[49][38][65][97][76][13][27]
n个记录看成n个有序的序列[3849][6597][1376][27]
第一趟合并[38496597][132776]
[13273849657697]
第二趟合并第三趟合并算法voidMerge(RcdTypeSR[],RcdType&TR[],inti,intm,intn) for(j=m+1,k=I;i<=m&j<=n;++k){ if(SR[i].key<=SR[j].key)TR[k]=SR[i++]; elseTR[k]=SR[j++]; } if(i<=m)TR[k..n]=S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四年级品德与社会下册 交通与我们的生活 2教学实录 人教新课标版
- 医院防跌倒课件
- 小学防性侵害课件
- 2023一年级数学上册 二 比较第3课时 跷跷板教学实录 北师大版
- 2025汽车租赁合同范本2
- 冀教版信息技术小学五年级下册《第13课 美丽的海洋世界》教学设计
- 中学生卫生健康知识讲座
- 三年级下美术教学设计+教学反思-门窗墙-苏教版
- 2025企业办公装修合同模板
- 2025装修合同协议书模板
- 医学资料 医院感染管理基本知识培训 学习课件
- 2025年山东高速集团总部部分业务技术岗位内部选聘9人自考难、易点模拟试卷(共500题附带答案详解)
- 模具单位年终工作总结
- 2025年考研护理面试试题及答案
- 2024全国职业院校技能大赛中职组“艺术设计”赛项备考试题库(含答案)
- 医护职业危害与防护知识
- 十八项核心制度培训课件
- 《深度学习原理》课程教学大纲
- 沪教版数学八年级上册全册教案
- 特殊场所的消防安全知识培训
- 航海英语听力与会话
评论
0/150
提交评论