赞
踩
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果i>j,那么就让k=j;j++,k++;
最后,一定会有一个数组里面留下元素,例如上面这个;
{2,7,9,12}中会有9和12留下,最后再把9和12放在待排序的数组里面就好了!
所以如果有一个数组是{1,4,6,8,2,7,9,12};
要对它进行排序,是不是应该给它分成两半分别是{1,4,6,8}和{2,7,9,12};
在进行上面的操作;
其实很简单,我们设三个变量left代表1,mid代表8,right代表12;
left 到 mid 就是{1,4,6,8},mid+1到 right 就是{2,7,9,12}
思路就是这样
接下来用代码实现一下
int merge(int r[],int s[],int left,int mid,int right) { int i,j,k; i=left; j=mid+1; k=left; while((i<=mid)&&(j<=right)) if(r[i]<=r[j]) { s[k] = r[i]; i++; k++; } else { s[k]=r[j]; j++; k++; } while(i<=mid) s[k++]=r[i++]; while(j<=right) s[k++]=r[j++]; return 0; }
这部分呢就是对{1,4,6,8,2,7,9,12}这样的数组进行排序的功能;
那会有同学问了,难道归并排序只能对这样的两个已经排序好的数组操作吗。
那他好垃圾啊;
不不不,当然不是这样的。
如果给一个数组{4,12,8,9,6,2,7};
咱归并是毫不抗拒的,不过呢,只靠上面的代码显然是实现不出来的。
那怎么办呢,加东西喽!
这就要用到一个叫做分治法的一个思想;
怎么回事呢;
就是把{4,12,8,9,6,2,7}分成两半,去执行上面的排序功能,哎我发现分割后;
{4,12,8}和{9,6,2,7}这两个也不满足我排序功能的条件啊!
哎,那我就吧{4,12,8}和{9,6,2,7}都再次分成两半;再去归并排序;
啊?你说还不满足,那就再给我分!最后分成一堆就剩两个元素的数组,一定满足了吧!
现在,我们用递归的方法把这个给实现出来;
int merge\_sort(int r[],int s[],int left,int right) { int mid; int t[20]; if(left==right) s[left]=r[right]; else { mid=(left+right)/2; merge\_sort(r,t,left,mid); merge\_sort(r,t,mid+1,right); merge(t,s,left,mid,right); } return 0; }
完全ojbk,归并排序的两个功能块我们就全实现出来了,现在我们来用主函数测试一下!
![img](https://img-blog.csdnimg.cn/img_convert/61841f7d14b7aba500447fa8b62f252d.png)
![img](https://img-blog.csdnimg.cn/img_convert/597460d570317f5e6bdfa8ad82405ea6.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。