归并排序,使用递归求解的方法
#include <stdlib.h>
#include <stdio.h>
void Merge(int a[],int low, int mid, int high)
{
//sizeof只有在看到数组定义时才能够测出字节数
// printf("sizeof(a)/sizeof(a[low])= %d\n",(sizeof(a[low])));//4
// printf("sizeof(a)/sizeof(a[low])= %d\n",(sizeof(a)/sizeof(a[low])));//4/4=1
printf("low= %d high= %d\n",low,high);
int b[high-low];
int i,j,k;
for(i=low; i<=high; i++)
{
b[i]=a[i];
printf("%d ",a[i]);
}
printf("\n");
for(i=low,j=mid+1,k=i; i<=mid&&j<=high; k++)
{
if(b[i]<=b[j])//比较左右两端数的大小
{
a[k]=b[i++];
}
else
a[k]=b[j++];
}
while(i<=mid)a[k++]=b[i++];//检测左右的数据是否遍历完
while(j<=high)a[k++]=b[j++];
printf("每轮排序后的结果:\n");
for(i=low; i<=high; i++)
{
printf("%d ",a[i]);
}
printf("\n\n");
}
void Merge_Sort(int k[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
Merge_Sort( k, low, mid);
Merge_Sort( k, mid+1, high);
Merge(k,low, mid, high);
}
}
int main()
{
int i,a[]= {1,22,5,8,97,8,4,6,7};
//int b[]= {1,2,3,4,5,6,7,8,9};
Merge_Sort(a,0,8);
printf("sizeof(a)/sizeof(a[0])= %d\n",(sizeof(a)/sizeof(a[0])));
printf("归并排序的结果是:");
for(i=0; i<9; i++)
{
printf("%d ",a[i]);
}
printf("\n\n");
return 0;
}
归并排序结果,Merge函数中为申请辅助数组长度,使用了sizeof(),但是在子函数中sizeof(),无法计算数组a的整个长度(sizeof() 只有在看到数组定义时才能够测出字节数),所以使用high-low。
使用的