龙空技术网

干货——归并排序

c语言爱好学习 114

前言:

此刻朋友们对“c语言归并排序算法”大体比较珍视,同学们都需要了解一些“c语言归并排序算法”的相关内容。那么小编同时在网上收集了一些对于“c语言归并排序算法””的相关知识,希望咱们能喜欢,大家一起来了解一下吧!

通过一张图了解什么是归并排序

归并排序实际上运用了“分”和“治”的思想。怎样理解“分”和“治”?

分:就是将一个大的数组逐渐分解为多个最大长度不超过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语言爱好者

原文链接:

标签: #c语言归并排序算法 #归并排序c语言算法详解