欢迎大家来到IT世界,在知识的湖畔探索吧!
通过一张图了解什么是归并排序
归并排序实际上运用了“分”和“治”的思想。怎样理解“分”和“治”?
分:就是将一个大的数组逐渐分解为多个最大长度不超过2的数组。
治:就是将这些小的数组依次合并排序,最后变成一个最大长度且有序的数组。
通过上面的归并排序的图解能够很自然的想到要实现这个排序需要用到递归。
首先讲怎样进行”分”的操作:
void mergeSort(int *nums,int low,int high){
int mid = (low+high)/2;
if(low<high) {
mergeSort(nums,low,mid);
mergeSort(nums,mid+1,high);
merge(nums,low,mid,high);//关于”治”的函数
}
}
怎样理解这段代码?为了便于叙述,建立数组
7253
执行上面的mergeSort函数:
1.第一次调用该方法,初始数据为:
nums[4] = {7,2,5,3};
low =0;
high =3;
2.得到mid=(0+3)/2 = 1;由于low<high,所以有
mergeSort(nums,low,mid);//此时的low=0,mid=1。令此函数为A
mergeSort(nums,mid+1,high);//此时的miid+1=2,high=3。令此函数为B
merge(nums,low,mid,high);
3.执行函数A,得到mid=(0+1)/2=0;由于low<high,所以有
mergeSort(nums,low,mid);//此时的low=0,mid=0。令此函数为C
mergeSort(nums,mid+1,high);//此时的miid+1=1,high=1。令此函数为D
merge(nums,low,mid,high);//令此函数为E
4.执行函数C,得到mid=(0+0)/2=0;由于low=high,所以函数C执行完毕,返回到步骤3执行函数D。
5.执行函数D,得到mid=(1+1)/2=1;由于low=high,所以函数D执行完毕,返回到步骤3执行函数E(就到了”治”的阶段)。
6.执行完步骤5,返回到步骤2执行函数B。
7.执行函数B,得到mid= (2+3)/2=2;由于low<high,所以有
mergeSort(nums,low,mid);// 此时的low=2,mid=2。令此函数为F
mergeSort(nums,mid+1,high);// 此时的miid+1=3,high=3。令此函数为G
merge(nums,low,mid,high);// 令此函数为H
8.执行函数F,得到mid=(2+2)/2=2;由于low=high,所以函数F执行完毕,返回到步骤7执行函数G。
9.执行函数G,得到mid=(3+3)/2= 3;由于low=high,所以函数G执行完毕,返回步骤7执行函数H(“治”)。
10.执行完函数G,返回步骤2执行函数merge。
再讲怎样进行”治”的操作:
voidmerge(int*nums,intlow,intmid,int high) {
intcopyArray[numsSize],flag,i,j,q;//numsSize为数组的长度
for(q =0;q
在执行mergeSort函数的过程中,步骤5第一次执行了merge函数。这里着重对第一次执行merge函数做一个详细的解释。
初始数据
nums[4] = {7,2,5,3};
copyArray[4] = {7,2,5,3};
low =0;
mid =1;
high =1;
执行循环
for(i = low,j = mid+1,flag=low;i<=mid && j<=high;) {
if(copyArray[j]
初始i、j、flag的值为
1i =0;2j =1;3flag =0;
因为
copyArray[0]>copyArray[1]//copyArray[0]=7 copyArray[1] = 2
所以有
nums[0] =2;
flag++ =1;//右边的值是flag++以后的值3j++ =2;
因为
high =1;
j =2;
不满足循环条件
j<=high
故for循环终止。接着执行
while(i<=mid) {
nums[flag++] = copyArray[i++];
}
while(j<=high) {
nums[flag++] = copyArray[j++];
}
由于i<=mid,故执行第一个while循环
nums[1] =7//copyArray[0] = 72i++ =1;
因为i>mid,循环结束,merge函数调用结束。此时的数组变成
nums[4] = {2,7,5,3};
第二次和第三次merge函数调用过程类似。
大家有兴趣学习C/C++的可以关注微信公众号:C语言爱好者
原文链接:https://www.cnblogs.com/jching/p/13291660.html
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/37759.html