#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void gui(int *a,int low,int mid,int high) //形参为一个指针变量(便于修改原数组重的值)
{
int t[high-low+1]; //定义一个中间数组,用于临时存放从原数组中取出的数据
int *p=t;
int i=low,j=mid+1; //将数组分成两半,i 为前一半,j 为后一半,遍历方向均为从左至右普
while(i<=mid && j<=high) //分别从已分开的数组开始,遍历比较找出较小的数存入临时数组 t[]中
//循环结束的条件为,有一半的数组已经遍历完
{
if(a[i]<a[j])
{
*p=a[i];
i++;
p++;
}
if(a[j]<a[i])
{
*p=a[j];
p++;
j++;
}
}
while(i<=mid) //若前一半数组中还有数据,则执行
{
*p=a[i];
i++;
p++;
}
while(j<=high) //若后一半数组中还有数据
{
*p=a[j];
j++;
p++;
}
for(i=low,j=0;i<=high,j<=high-low;i++,j++) //将已取出的数据重新赋值给原数组 a[]
a[i]=t[j];
}
void guibing(int a[],int low,int high) //递归过程下图
{
if(low<high) //当if条件满足时,表明数组中至少有两个数据
{
int mid;
mid=(high+low)/2;
guibing(a,low,mid); //递归归并左半数组
guibing(a,mid+1,high); //递归归并右半数组
gui(a,low,mid,high); //当上面两条语句执行完后,a[]中只剩2个数据,进行归并
}
}
int main()
{
int i;
int a[10];
srand(time(NULL)); //乱序
for(i=0;i<10;i++)
a[i]=rand(); //生成乱序数组
guibing(a,0,9); //传入实参为元素下标
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
函数递归的过程: