C++各类排序算法介绍PPT课件.pptx
《C++各类排序算法介绍PPT课件.pptx》由会员分享,可在线阅读,更多相关《C++各类排序算法介绍PPT课件.pptx(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2022-4-241contents 9.1 概述概述 9.2 插入排序插入排序1.1.直插排序直插排序2.2.二分插入排序二分插入排序 3.3.希尔排序希尔排序 9.3 交换排序交换排序1.1.冒泡排序冒泡排序2.2.快速排序快速排序 9.4 选择排序选择排序1.1.直选排序直选排序2.2.堆排序堆排序 9.5 归并排序归并排序1.1.二路归并排序二路归并排序2022-4-2429.1 概述概述 排序定义排序定义将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫 排序分类排序分类按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排
2、序按排序依据原则 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 基数排序2022-4-243 按排序所需工作量 简单的排序方法:T(n)=O(n) 先进的排序方法:T(n)=O(logn) 基数排序:T(n)=O(d.n) 排序基本操作排序基本操作 比较两个关键字大小 将记录从一个位置移动到另一个位置2022-4-244 基本思想:基本思想:每次将一个待排序的记录,按其关键字值的大小插入到已经排好序的表中,直至全部插入完成。 根据“寻找寻找”插入位置的方法插入位置的方法不同,插入法可分为:直插排序、二分插
3、入排序、希尔排序。 (1) 直接插入排序直接插入排序 若将一个未排序的元素Li插入到已排序的具有i-1个元素的序列的适当位置,步骤如下: a. 从右向左顺序搜索已排序的序列,若已排序序列中的元素比Li大,则后移一个位置,直至找到一个元素Lj-1(0j-1i-1)的关键字值比Li的关键字值小; b. 将Li插入表中第j个位置上,成为Lj。9.2 插入排序插入排序2022-4-245例49 38 65 97 76 13 27i=2 38 (38 49) 65 97 76 13 27i=3 65 (38 49 65) 97 76 13 27i=4 97 (38 49 65 97) 76 13 27i
4、=5 76 (38 49 65 76 97) 13 27i=6 13 (13 38 49 65 76 97) 27i=1 ( )i=7 (13 38 49 65 76 97 ) 2727jjjjjj977665493827 (13 27 38 49 65 76 97)排序结果:2022-4-246void InsertSort(int a,const int n) for(int i=1;in;i+) /i表示插入次数,共进行表示插入次数,共进行n-1次插入次插入if(aiai-1) /将将ai插入到有序区插入到有序区a0,ai-1中,中,/且且aiai-1int x=ai; /把待排序元素赋
5、给把待排序元素赋给 x/从从ai-2开始比较开始比较for(int j=i-1; (x=0); j-)aj+1=aj; /从从ai-1开始后移一位开始后移一位/直到找到一个元素,插入到正确位置直到找到一个元素,插入到正确位置aj+1=x; 2022-4-247 算法评价 时间复杂度 若待排序记录按关键字从小到大排列(正序)Y关键字比较次数:112nniY记录移动次数:)1(222nni 若待排序记录按关键字从大到小排列(逆序)Y关键字比较次数:2)1)(2(2nniniY记录移动次数:2)1)(4()1(2nnini 若待排序记录是随机的,取平均值Y关键字比较次数:42nY记录移动次数:42n
6、T(n)=O(n)2022-4-248 (2) 折半插入排序折半插入排序 排序过程:用折半查找方法确定插入位置的排序叫例i=1 (30) 13 70 85 39 42 6 20i=2 13 (13 30) 70 85 39 42 6 20i=7 6 (6 13 30 39 42 70 85 ) 20.i=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sjmi=8 20 (6 13 30 39 42 70 85 ) 20sji=8 20 (6
7、13 20 30 39 42 70 85 )2022-4-249 算法描述时间复杂度:T(n)=O(n)void BinsertSort(int a,const int n)for(int i=1;in;i+) int b=ai;int low=0;int high=i-1;while(low=high) int m=(low+high)/2;if(b=high+1;j-)aj+1=aj;ahigh+1=b;2022-4-2410 (3) 希尔排序希尔排序(缩小增量法缩小增量法) 排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序直接插入排序;然后取d2d1,重复
8、上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。2022-4-2411取d3=1三趟分组:13 27 48 55 4 49 38 65 97 76三趟排序:4 13 27 38 48 49 55 65 76 97例 初始: 49 38 65 97 76 13 27 48 55 4一趟排序:13 27 48 55 4 49 38 65 97 76二趟排序:13 4 48 38 27 49 55 65 97 76取d1=5一趟分组:49 38 65 97 76 13 27 48 55 4取d2=3二趟分组:13 27 48 55 4 49 38 65 97 762022-4-24
9、12 算法描述算法描述例49 38 65 97 76 13 27 48 55 4#define T 3int d=5,3,1;ji49133827一趟排序:13 27 48 55 4 49 38 65 97 76jiji274jiji55ji38jijiji二趟排序: 13 4 48 38 27 49 55 65 97 76jiji6548ji9755ji7642022-4-2413void ShellInsert(int a, int n, int dk)for(int i=dk;in;i+)if(ai=0)&(baj);j-=dk)aj+dk=aj;aj+dk=b;void ShellSo
10、rt(int a,int n,int dlta,int t)for(int k=0;kr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。 对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。9.3 交换排序交换排序2022-4-2416例49 38 65 97 76 13 27 30初始关键字38 49 65 76 13 27 30 97第一趟38 49 65 13 27 30 7
11、6第二趟38 49 13 27 30 65第三趟38 13 27 30 49第四趟13 27 30 38第五趟13 27 30第六趟384976971397279730971376767627301365276530651313494930492738273830382022-4-2417void bubble_sort(JD r, int n) int m,i,j,flag=1; /当当flag为为0则停止排序则停止排序JD x;m=n-1;while(m0)&(flag=1) /m表示趟数表示趟数flag=0; /开始时元素未交换开始时元素未交换for(j=1; jrj+1.key) /发
12、生逆序发生逆序 flag=1;x=rj;rj=rj+1;rj+1=x; /交换,并标记发生了交换m-;/while 冒泡算法描述2022-4-2418 算法评价 时间复杂度 最好情况(正序)Y比较次数:n-1Y移动次数:0 最坏情况(逆序)Y比较次数:)(21)(211nninniY移动次数:)(23)(321nninniT(n)=O(n)Ch8_4.c2022-4-2419 (2) 快速排序快速排序 基本思想:通过一趟排序,将待排序记录分割成独立的独立的两部分两部分,其中一部分记录的关键字均比另一部分记录的另一部分记录的关键字小关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。
13、排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设基准值基准值记录rp=rs,x=rp.key 初始时令i=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换 重复上述两步,直至i=j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止关键字通常取第一个记录的值为基准值。关键字通常取第一个记录的值为基准值。2022-4-2420例初始关键字: 49 38 65 97 76 13 27 50 ijxji 完成一趟排序: ( 27 38 13) 49 (76 97 65 50
14、) 分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97) 快速排序结束: 13 27 38 49 50 65 76 974927ijijij4965ji1349ij4997ij2022-4-2421void qksort(JD r, int t, int w)int i, j, k;JD x;if(t=w) return;i=t; j=w; x=ri;while(ij)while(i=x.key) j-;if(ij) ri=rj; i+; while(ij)&(ri.key=x.key) i+;if(ij) rj=ri; j-; ri=x;qksort(r,t,
15、j-1);qksort(r,j+1,w); 快速算法描述2022-4-2422 算法评价 时间复杂度 最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n)T(n)=O(n)Ch8_5.c2022-4-2423 (0) 选择排序原理:选择排序原理: 将待排序的结点分为已排序(初始为空)和未排序两组,依次将未排序的结点中值最小的结点未排序的结点中值最小的结点插入已排序的组中。 (1) 直接选择排序过程直接选择排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换 再通过n-2次比较,从
16、剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束9.4 选择排序选择排序2022-4-2424例初始: 49 38 65 97 76 13 27 kjjjjjjkki=11349一趟: 13 38 65 97 76 49 27 i=2kkjjjjj2738二趟: 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 49 65 76 97 排序结束: 13 27 38 49
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 各类 排序 算法 介绍 PPT 课件
限制150内