相对来说,归并排序的思路还是比较简单的,就是一个划分和合并的过程,相对应的思路就直接在代码中注释了
代码:
//归并排序:
//合并:
void merge(int *arr,int low1,int high1,int low2,int high2){
//使用a1,a2两个数组分别记录arr拆分的前后两段:
int n1=high1-low1+1;
int n2=high2-low2+1;
int a1[n1],a2[n2];
for(int i=0;i<n1;i++)
a1[i]=arr[i+low1];
for(int i=0;i<n2;i++)
a2[i]=arr[i+low2];
//使用i,j,k分别记录a1,a2,arr下标:
int i=0,j=0,k=low1;
while(i<n1&&j<n2){
if(a1[i]<a2[j])arr[k++]=a1[i++];//相当于arr[k]=a1[i];i++;k++;
else
arr[k++]=a2[j++];
}
//当a1或a2中还有数字未排序进入arr,使用while语句将剩余数据导入:
while(i<n1)arr[k++]=a1[i++];
while(j<n2)arr[k++]=a2[j++];
}
void mergeSort(int *arr,int low,int high){
if(low>=high)
return;
int mid=low+(high-low)/2;
//拆分为前后两个序列:
mergeSort(arr,low,mid);
mergeSort(arr,mid+1,high);
merge(arr,low,mid,mid+1,high);//合并
}