//递归排序
#include<stdio.h>
#include<stdlib.h>
//归并排序-合并
void merge(int arr[],int tempArr[],int left,int mid,int right)
{
//标记左边未排序的元素
int l_pos=left;
//标记右边未排序的元素
int r_pos=mid+1;//从中间分组右边第一个是中间位置+1
int pos=left;
//开始合并
while(l_pos<=mid&&r_pos<=right)
{
if(arr[l_pos]<arr[r_pos])
tempArr[pos++]=arr[l_pos++];
else
tempArr[pos++]=arr[r_pos++];
}
//合并左边剩余的元素
while(l_pos<=mid)
{tempArr[pos++]=arr[l_pos++];}//用于右边数据比对完后,跳出了上一个循环,左边数据未放入的问题
while(r_pos<=right)
{
tempArr[pos++]=arr[r_pos++];
}
while(left<=right)
{
arr[left]=tempArr[left];
left++;
}
}
//归并排序-分治
void msort(int arr[],int tempArr[],int left,int right)
{
if(left < right)//表示数组下标,左边小于右边时才表示有两个以上的数据
{
//先找中间点
int mid = (left+right)/2;
//开始划分左半区
msort(arr,tempArr,left,mid);
//开始划分右半区
msort(arr,tempArr,mid+1,right);
//开始进行合并操作
merge(arr,tempArr,left,mid,right);
} //全是递归调用
}
void merge_sort(int arr[],int n)
{
//分配一个辅助函数
int *tempArr=(int *)malloc(n *sizeof(int));
if(tempArr)
{
msort(arr,tempArr,0,n-1);
free(tempArr);
}
else
{
printf("空间申请错误!");
}
}
int main(int argc,char const *argv[])
{
int arr[]={9,5,2,7,12,4,3,1,11};
int n=9;
for(int i=0;i<n;i++)
{
printf("%3d",arr[i]);
}
merge_sort(arr,n);
printf("\n");
for(int i=0;i<n;i++)
{
printf("%3d",arr[i]);
}
}