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);
}
}