实验内容:在main函数中定义数A[]={52,49,80,36,14,58,61,23,97},调用归并排序函数MergeSort对A[]中的数据进行排序,调试并观察排序过程。
#include<stdio.h>
#include<stdlib.h>
void merge(int *data,int low,int mid,int high)
{//将两个有序的子文件data[low..m)和data[m+1..high]归并成一个有序的子文件data[low..high]
int i=low;//置初始值
int j=mid+1;
int p=0;
int *temp;//temp是局部向量
temp=(int *)malloc((high-low+1)*sizeof(int));
if(!temp) return;//申请空间失败
while((i<=mid)&&(i<=high))
temp[p++]=(data[i]<=data[j])?data[i++]:data[j++];//两子文件非空时取其小者输出到temp[p]上
while(i<=mid)//若第1个子文件非空,则复制剩余记录到temp中
temp[p++]=data[i++];
while(j<=high)
temp[p++]=data[j++];//若第2个子文件非空,则复制剩余记录到temp中
for(p=0,i=low;i<=high;p++,i++)
data[i]=temp[p];//归并完成后将结果复制回data[low..high]
}
void mergesort(int data[],int low,int high)
{//用分治法对data[low..high]进行二路归并排序
int mid;
if(low<high)
{//区间长度大于1
mid=(low+high)/2;//分解
mergesort(data,low,mid);//递归地对R[low..mid]排序
mergesort(data,mid+1,high);//递归地对R[mid+1..high]排序
merge(data,low,mid,high);//组合,将两个有序区归并为一个有序区
}
}
void main()
{
int A[9]={52,49,80,36,14,58,61,23,97};//这里对8个元素进行排序
int i;
for(i=0;i<9;i++)
printf("A[%d]=%d ",i,A[i]);
mergesort(A,0,8);
printf("\nMergeSort...\n");
for(i=0;i<9;i++)
printf("A[%d]=%d ",i,A[i]);//输出测试
}
运行结果: