版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
讲师:朱兴林第4章几种常见的排序算法本章目标本章概述几种常见排序算法。本章目标熟悉常见的查找算法和排序算法重点能够里用函数库提供的API进行查找或排序操作难点快速排序算法本章结构数据结构与算法初步常见的排序算法常见的排序算法冒泡排序快速排序直接插入排序希尔排序选择排序堆排序归并排序冒泡排序冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。冒泡排序是稳定的。算法时间复杂度是O(n^2)。算法描述210825492516214925251608214925251608214925251608214925251608214925251608初始关键字第一趟排序第四趟排序第二趟排序第三趟排序第五趟排序算法实例如下:输入n个数给a[1]到a[n]forj=1ton-1fori=1ton-ja[i]>a[i+1]真假a[i]a[i+1]输出a[1]到a[n]算法实现#include<stdio.h>
voidbubbling_sort(int*a,intn);
intmain(){inta[5]={5,4,3,2,1};bubbling_sort(a,5);
inti;for(i=0;i<5;i++){ printf("%d\n",a[i]);}}
voidbubbling_sort(int*a,intn){ inti,j,temp; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }}}}快速排序算法描述快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。2108254925*16始关键字08254925*162108254925*1608254925*1608254925*1608254925*1621pivotkey一次交换二次交换三次交换high-1完成一趟排序lowhighlowlowlowlowlowhighhighhighhighhigh算法实例254925*162108254925*162108完成一趟排序分别进行快速排序有序序列08254925*1621算法实例#include<stdio.h>
voidquick_sort(int*a,intstart,intend);
intmain(){ inta[5]={4,2,6,8,1}; quick_sort(a,0,4); inti; for(i=0;i<5;i++) { printf("%d\n",a[i]); }
return0;}voidquick_sort(int*a,intstart,intend){ inti=start,j=end; intkey=a[start];//在起始位置挖坑,等待被填 while(start<end) {while(start<end) { if(a[end]<=key) { a[start]=a[end];//把a[end]挖出来,填到a[start]坑里 start++;
break;}end--;}while(start<end){if(a[start]>key){a[end]=a[start]; end--; break;} start++;}}
intmid=start; a[mid]=key;
if(i<mid-1) quick_sort(a,i,mid-1); if(j>mid+1) quick_sort(a,mid+1,j); }算法实现算法分析:快速排序是一个递归过程;利用序列第一个记录作为基准,将整个序列划分为左右两个子序列。只要是关键字小于基准记录关键字的记录都移到序列左侧;快速排序的趟数取决于递归树的高度。如果每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况
直接插入排序算法描述插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j]≤L[j+1]时为止。#include<stdio.h>voiddirectinsert_sort(int*a,intn);
intmain(){ inta[5]={5,7,3,1,2}; directinsert_sort(a,5); inti; for(i=0;i<5;i++) { printf("%d\n",a[i]); }}voiddirectinsert_sort(int*a,intn){ inti,j,temp;; for(i=1;i<n;i++) { temp=a[i]; for(j=i-1;j>=0&&temp<a[j];j--) a[j+1]=a[j];//往后挪动
a[j+1]=temp; }}
算法实现选择排序在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环
到倒数第二个数和最后一个数比较为止。算法描述算法实例#include<stdio.h>voidselect_sort(int*a,intn);
intmain(){ intarr[5]={5,7,3,1,2}; select_sort(arr,5);
inti; for(i=0;i<5;i++) { printf("%d\n",arr[i]); }}
voidselect_sort(int*a,intn){ inti,j,min,temp; for(i=0;i<n-1;i++)//循环n-1趟 { min=i; for(j=i+1;j<n;j++)//从i+1开始比较 { if(a[min]>a[j]) min=j; }
if(min!=i) { temp=a[min]; a[min]=a[i]; a[i]=temp; } }}希尔排序希尔排序是插入排序的增强版。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
算法实例运用实例已知待排序的一组记录的初始排列为:21,25,49,25*,16,080123452108254925*16t12108254925*162108254925*16t22108254925*162108254925*16t30123452108254925*160123452108254925*16算法实例#include<stdio.h>
voidshell_sort(int*a,intn);
intmain(){ inta[5]={4,2,5,7,1}; shell_sort(a,5); inti; for(i=0;i<5;i++) { printf("%d\n",a[i]);
}}
voidshell_sort(int*a,intn){inti,j,d,temp;for(d=n/2;d>=1;d/=2)//增量改变一般是数组元素个数累除2{for(i=d;i<n;i++)//注意这里的i++不是i=i+d;temp=a[i];for(j=i-d;j>=0&&temp<a[j];j-=d){a[j+d]=a[j];}a[j+d]=temp;}}}算法分析开始时gap的值较大,子序列中的记录较少,排序速度较快随着排序进展,gap值逐渐变小,子序列中记录个数逐渐变多,由于前面大多数记录已基本有序,所以排序速度仍然很快Gap的取法有多种。shell提出取gap=n/2,gap=gap/2,直到gap=1。下面是几种常见的排序算法的封装封装的冒泡法:voidmybubbling_sort(int*a,intn,intsize,int(*cmp)(void*,void*)){inti,j;void*temp=malloc(size);if(temp==NULL){ printf("cannotmalloc\n"); return;}for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++) { if(cmp((char*)a+j*size,(char*)a+(j+1)*size)>0) { memcpy(temp,(char*)a+j*size,size); memcpy((char*)a+j*size,(char*)a+(j+1)*size,size); memcpy((char*)a+(j+1)*size,temp,size); } } } free(temp);}下面是几种常见的排序算法的封装封装的选择排序法voidmyselect_sort(void*a,intnmeb,intsize,int(*cmp)(void*,void*)){ inti,j,min; void*temp=malloc(size); if(temp==NULL) { printf("cannotmalloc\n"); return;} for(i=0;i<nmeb-1;i++) { min=i; for(j=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目总监年终总结
- 生态文明建设背景下全域综合整治与矿地综合开发利用的实践与探索
- 挂名股东协议
- 建筑总工程师年度工作总结
- 二零二四年度钢筋工程质量监督与检验合同
- 煤矸石处理与环保服务合同(2024版)
- 美容店智能设备采购合同2024
- 手车买卖合同模板
- 全新安防监控系统安装合同书下载3篇
- 2024年度离婚案件律师团队胜诉后服务合同3篇
- 《小水电生态流量泄放设施改造及监测技术导则》
- 国开2024年秋《生产与运作管理》形成性考核1-4答案
- 高效团队执行四步法_ ppt课件
- 军休工作个人总结个人
- 卷扬机专项安全操作方案
- 公共生活中的道德规范
- 空运货物装载知识
- 工程重油发电机组安装施工组织设计
- 上交所股票期权适当性考试题库
- 设计管理部门职责和工作流程2017
- 希望之星决赛即兴问答话题汇总(优选.)
评论
0/150
提交评论