merge函数:将数组从left(起始位置)到right(终点位置)的数据,先折半拆分为两组。分别从两组的起始数据开始进行比较,较小的值被保存,然后标志值增加(指针后移),直到将两组数据全都遍历一遍。将保存的数据依次按顺序覆盖写入数组a,作为输出流输出。
mergesort函数(归并排序):利用递归的方法进行数组的拆分,调用merge函数,实现排序。
/* 将数组折半分组后,再合并排序*/
static void merge(int a[], int left, int right)
{
int mid = (left + right) / 2;
int i = left;
int j = mid + 1;
int k = 0;
int *temp = (int *)malloc(sizeof(int) * (right - left + 2));
assert(temp);
while(i < mid + 1 || j < right + 1)
{
if(i < mid + 1 && j < right + 1)
{
if(a[i] < a[j])
{
temp[k] = a[i];
k++;
i++;
}
else
{
temp[k] = a[j];
k++;
j++;
}
}
else if(i < mid + 1)
{
temp[k] = a[i];
k++;
i++;
}
else
{
temp[k] = a[j];
k++;
j++;
}
}
i = 0;
for(j = left; j < right + 1; j++)
{
a[j] = temp[i];
i++;
}
free(temp);
}
/*
*Function : mergeSort
*Description: 归并排序
*Param in : a 待排序的数据首地址
left 待排序的数据起始位置(最低位为0)
right 待排序的数据终点位置
*Param out : a 排序后的数据首地址
*Retrun : 无
*/
void mergeSort(int a[], int left, int right)
{
int mid = 0;
if(left == right)
{
return;
}
else
{
mid = (left + right) / 2;
mergeSort(a, left, mid);
mergeSort(a, mid + 1, right);
merge(a, left, right);
}
}