版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、6.1 常见的排序算法常见的排序算法 冒泡排序 快速排序 直接插入排序 希尔排序 选择排序 堆排序 归并排序 6.1.1 冒泡排序冒泡排序 算法描述设待排序记录序列中的记录个数为n一般地,第i趟起泡排序从1到n-i+1依次比较相邻两个记录的关键字,如果发生逆序,则交换之其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1趟。6.1.1 冒泡排序冒泡排序 算法实例0 1 2 3 4 56.1.1 冒泡排序冒泡排序 算法实例0 1 2 3 4 56.1.1 冒泡排序冒泡排序 算法实例初始关键字第一趟排序第四趟排序第二趟排序第三趟排序第五趟排序6.1.1 冒泡排序
2、冒泡排序 算法实现输入n 个数给a1 到 anfor j=1 to n-1for i=1 to n-jaiai+1真假aiai+1输出a1 到 an#include main() int a11,i,j,t; printf(Input 10 numbers:n); for(i=1;i11;i+) scanf(%d,&ai); printf(n); for(j=1;j=9;j+) for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf(The sorted numbers:n); for(i=1;i11;i+)printf(%d ,ai);6.1.2 快
3、速排序快速排序 算法特点:快速排序是通过比较关键码、交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分一部分所有记录的关键码大于等于支点记录的关键码另一部分所有记录的关键码小于支点记录的关键码 6.1.2 快速排序快速排序 算法描述:任取待排序记录序列中的某个记录(例如取第一个记录)作为基准(枢),按照该记录的关键字大小,将整个记录序列划分为左右两个子序列左侧子序列中所有记录的关键字都小于或等于基准记录的关键字 右侧子序列中所有记录的关键字都大于基准记录的关键字基准记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。然后分别对这两个子序列重复施行上述方法,直到所有的记录都
4、排在相应位置上为止。基准记录也称为枢轴(或支点)记录。取序列第一个记录为枢轴记录,其关键字为Pivotkey指针low指向序列第一个记录位置指针high指向序列最后一个记录位置6.1.2 快速排序快速排序 算法实例:始关键字始关键字pivotkey一次交换一次交换二次交换二次交换三次交换三次交换high-1完成一趟排序完成一趟排序lowhighlowlowlowlowlowhighhighhighhighhigh6.1.2 快速排序快速排序 算法实例:10完成一趟排序完成一趟排序分别进行快速排序分别进行快速排序有序序列有序序列6.1.2 快速排序快速排序 算法分析:快速排序是一个递归过程;利用
5、序列第一个记录作为基准,将整个序列划分为左右两个子序列。只要是关键字小于基准记录关键字的记录都移到序列左侧;快速排序的趟数取决于递归树的高度。如果每次划分对一个记录定位后, 该记录的左侧子序列与右侧子序列的长度相同, 则下一步将是对两个长度减半的子序列进行排序, 这是最理想的情况 116.1.3 直接插入排序直接插入排序 算法描述:记录存放在数组R0.n-1中,排序过程的某一中间时刻,R被划分成两个子区间R0i-1和Ri.n-1,其中:前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分。 基本操作将当前无序区的第1个记录Ri插入到有序区R0.i-1中适当的位置,使R0i变为新的有
6、序区 6.1.3 直接插入排序直接插入排序 操作细节:当插入第当插入第i(i1)i(i1)个对象时个对象时, , 前面的前面的r0, r1, r0, r1, , ri-1, ri-1已经排已经排好序。好序。用用riri 的关键字与的关键字与ri-1, ri-2, ri-1, ri-2, 的关键字顺序进行比较的关键字顺序进行比较( (和顺和顺序查找类似序查找类似) ),如果小于,则将,如果小于,则将rxrx 向后移动向后移动( (插入位置后的记录向插入位置后的记录向后顺移后顺移) )找到插入位置即将找到插入位置即将riri 插入插入6.1.3 直接插入排序直接插入排序 实用例子:已知待序的一组记
7、录的初始排列为:已知待序的一组记录的初始排列为:21, 25, 49, 2521, 25, 49, 25* *, 16, 08, 16, 080 1 2 3 4 56.1.3 直接插入排序直接插入排序 实用例子:0 1 2 3 4 5 temp250 1 2 3 4 5 temp4925*0 1 2 3 4 56.1.3 直接插入排序直接插入排序 实用例子:0 1 2 3 4 5 temp160 1 2 3 4 5 temp080 1 2 3 4 5完成6.1.3 直接插入排序直接插入排序 算法实现:void InsertSort (int r , int n ) / 假设关键字为整型,放在向
8、量假设关键字为整型,放在向量r中中 int i, j, temp; for (i = 1;i0;j- -) /从后向前顺序比较,并依次后移从后向前顺序比较,并依次后移 if ( temp rj-1 ) rj = rj-1; else break; rj = temp; 6.1.3 直接插入排序直接插入排序 算法分析:关键字比较次数和记录移动次数与记录关键字的初始排列有关。最好情况下, 排序前记录已按关键字从小到大有序, 每趟只需与前面有序记录序列的最后一个记录比较1次, 移动2次记录, 总的关键字比较次数为 n-1, 记录移动次数为 2(n-1)在平均情况下的关键字比较次数和记录移动次数约为
9、n2/4。直接插入排序是一种稳定的排序方法直接插入排序最大的优点是简单,在记录数较少时,是比较好的办法6.1.4 希尔排序希尔排序 希尔排序又称缩小增量排序 是1959年由D.L.Shell提出来的 算法描述先取定一个小于n的整数d作为第一个增量,把表的全部记录分成d组所有距离为d1的倍数的记录放在同一组中,在各组内进行直接插入排序然后取第二个增量d2d1重复上述的分组和排序,直至增量d1,即所有记录放在同一组中进行直接插入排序为止。 6.1.4 希尔排序希尔排序 算法特点先取定一个小于n的整数d作为第一个增量,把表的全部记录分成d组所有距离为d1的倍数的记录放在同一组中,在各组内进行直接插入
10、排序然后取第二个增量d2d1重复上述的分组和排序,直至增量d1,即所有记录放在同一组中进行直接插入排序为止。 6.1.4 希尔排序希尔排序 运用实例先取定一个小于n的整数d作为第一个增量,把表的全部记录分成d组所有距离为d1的倍数的记录放在同一组中,在各组内进行直接插入排序然后取第二个增量d2d1重复上述的分组和排序,直至增量d1,即所有记录放在同一组中进行直接插入排序为止。 6.1.4 希尔排序希尔排序 希尔排序又称缩小增量排序 是1959年由D.L.Shell提出来的 算法描述首先取一个整数 gap n(待排序记录数) 作为间隔, 将全部记录分为 gap 个子序列, 所有距离为 gap 的
11、记录放在同一个子序列中在每一个子序列中分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2重复上述的子序列划分和排序工作,直到最后取gap = 1, 将所有记录放在同一个序列中排序为止。6.1.4 希尔排序希尔排序 运用实例已知待排序的一组记录的初始排列为:已知待排序的一组记录的初始排列为:21, 25, 49, 2521, 25, 49, 25* *, 16, 08, 16, 080 1 2 3 4 5 6.1.4 希尔排序希尔排序 运用实例t 30 1 2 3 4 50 1 2 3 4 5t 2t 16.1.4 希尔排序希尔排序 算法分析开始时 gap 的值较大,
12、子序列中的记录较少, 排序速度较快随着排序进展, gap 值逐渐变小, 子序列中记录个数逐渐变多,由于前面大多数记录已基本有序, 所以排序速度仍然很快Gap的取法有多种。 shell 提出取 gap = n/2,gap = gap/2,直到gap = 1。6.1.5 选择排序选择排序 排序过程:排序过程:首先通过首先通过n-1次比较,从次比较,从n个数中找出最小的,个数中找出最小的, 将它与第一个数将它与第一个数 交换交换第一趟选择排序,结果最小的数被安置在第一个元素位第一趟选择排序,结果最小的数被安置在第一个元素位置上置上再通过再通过n-2次比较,从剩余的次比较,从剩余的n-1个数中找出关键
13、字次小的记录,个数中找出关键字次小的记录,将它与第二个数交换将它与第二个数交换第二趟选择排序第二趟选择排序重复上述过程,共经过重复上述过程,共经过n-1趟排序后,排序结束趟排序后,排序结束6.1.5 选择排序选择排序 排序实例:排序实例:例初始: 49 38 65 97 76 13 27 kji=11349一趟: 13 38 65 97 76 49 27 i=22738二趟: 13 27 65 97 76 49 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 4
14、9 65 76 97 kkkkjjjjjjjjjj6.1.5 选择排序选择排序 算法实例:算法实例:0 1 2 3 4 56.1.5 选择排序选择排序 算法实例:算法实例:0 1 2 3 4 5最小者最小者最小者最小者各趟排序后的结果各趟排序后的结果6.1.5 选择排序选择排序 算法实例:算法实例:0 1 2 3 4 5i =2时选择排序的过程时选择排序的过程i k j i k j i k j 6.1.5 选择排序选择排序 算法实例:算法实例:0 1 2 3 4 5i k j 6.1.5 选择排序选择排序 算法实现:算法实现:输入n 个数给a1 到 anfor i=1 to n-1for j=
15、i+1 to najak真假k=j输出a1 到 ank=iaiaki != k真假#include main() int a11,i,j,k,x; printf(Input 10 numbers:n); for(i=1;i11;i+) scanf(%d,&ai); printf(n); for(i=1;i10;i+) k=i; for(j=i+1;j=10;j+) if(ajak) k=j; if(i!=k) x=ai; ai=ak; ak=x; printf(The sorted numbers:n); for(i=1;i11;i+)printf(%d ,ai);阶段小节阶段小节 几种常见的排序算法 冒泡排序的特点 快速排序的特点,一趟排序的子过程本章总结本章总结数据结构与算法初步数据结构与算法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年跨境电商物流代理服务合同模板3篇
- 2025年度新能源车辆租赁合同担保协议书范本3篇
- 2024年精简版住宅前期物业服务协议范本版B版
- 2024版生物医药制品研发与生产合同
- 2025年度医疗器械出口销售合同空白格式3篇
- 2024版木制别墅建造合同样本
- 2024年私人租房合同附加房产增值收益分享协议2篇
- 2025年度旅游企业实习生服务技能与职业素养培养协议3篇
- 2024年版房屋买卖合同示范2篇
- 2024年邮政快递服务协议
- 自身免疫性脑炎课件
- 2024-2030年撰写:中国第三方检测项目风险评估报告
- 信阳农林学院《新媒体传播学》2023-2024学年第一学期期末试卷
- 2024建筑公司年终工作总结(32篇)
- 污水厂防汛知识培训课件
- 建立创新攻关“揭榜挂帅”机制行动方案
- 2024年浙江省杭州余杭区机关事业单位招用编外人员27人历年管理单位遴选500模拟题附带答案详解
- 10kV供配电系统电气运行规程
- FMEA培训教材(课堂)
- 医院自助机培训
- 2024年支原体肺炎治疗
评论
0/150
提交评论