归并排序是排序算法中经常使用的算法。
归并排序思想:
两个函数MegerSort(int *arr,int left,int right);//递归调用此函数,不断对数组进行划分,只剩一个元素时,进行归并,然后两两归并,四四归并,直到整个数组都有序。
Meger(int *arr,int left,int mid,int right);//归并函数,left到mid有序,mid到right有序,然后把两段进行归并,使left到right有序。
下面上代码:
void Meger(int *ar,int start,int mid,int end)
{
assert(NULL != ar);
int *br = (int *)malloc(sizeof(int) * (end-start+1));
//开辟一个数组,排序时先存放到数组br,排序完成后再移动到ar中
assert(NULL != br);
int k = 0;
int s = start;
int m = mid+1;
while (s<=mid && m<=end)
{
//从两段头开始比较,往后移动
if (ar[s] < ar[m])
{
br[k++] = ar[s++];
}
else
{
br[k++] = ar[m++];
}
}
while (s<=mid)
br[k++] = ar[s++];
//比较完后,把前半段剩下的挪到br
while (m <= end)
br[k++] = ar[m++];
//或者比较完后,把后半段剩下的挪到br
for (int i=0;i<k;i++)
{
ar[start+i] = br[i];
}
free(br);
}
void MegerSort(int *arr,int start,int end)
{
assert(NULL != arr);
if (start < end)
{
int mid = start+(end-start)/2;
MegerSort(arr,start,mid);
MegerSort(arr,mid+1,end);
Meger(arr,start,mid,end);
}
}