#include <stdio.h>
#include <stdlib.h>
void merge(int* arr, int nStart, int nMid, int nEnd)
{
int i = nStart, j = nMid + 1;
int nIdx = 0;
int nLen = nEnd - nStart + 1;
int* arrTmp = (int*)malloc(sizeof(int)*nLen);
while ((i < nMid+1) && (j < nEnd + 1))
{
if (arr[i] < arr[j])
{
arrTmp[nIdx] = arr[i];
i++;
}
else
{
arrTmp[nIdx] = arr[j];
j++;
}
nIdx++;
}
if (i == nMid+1)
{
memcpy(&arrTmp[nIdx], &arr[j], sizeof(int)*(nEnd-j+1));
}
if (j == nEnd+1)
{
memcpy(&arrTmp[nIdx], &arr[i], sizeof(int)*(nMid-i+1));
}
memcpy(&arr[nStart], arrTmp, sizeof(int)*nLen);
}
void merge_sort(int* arr, int nStart, int nEnd)
{
if ((nStart >= nEnd) || (NULL == arr))
return;
int nMid = (nEnd + nStart) / 2;
merge_sort(arr, nStart, nMid);
merge_sort(arr, nMid+1, nEnd);
merge(arr, nStart, nMid, nEnd);
}
int main()
{
int arrTest[] = {4,2,0,9,8,1,3,5,7,6};
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arrTest[i]);
}
printf("\n\n");
merge_sort(arrTest, 0, 9);
for (i = 0; i < 10; i++)
{
printf("%d ", arrTest[i]);
}
scanf("%d", &i);
return 0;
}
算法分析:
时间复杂度
最好情况 T(n)=O(nlog2n)
最坏情况 T(n)=O(nlog2n)
是时间复杂度稳定的排序方式