时间复杂度:
O(nlogn)
void merge(int A[], int low, int mid, int high)
{
int len = high-low+1;
int* B = (int*)malloc(len*sizeof(int));
if (!B) printf("Failed to allocate memory\n");
int* pB = B;
int left = low;
int left_end = mid+1;
int right = mid+1;
int right_end = high+1;
while (left < left_end && right < right_end)
*pB++ = A[left] < A[right] ? A[left++] : A[right++];
while (left < left_end)
*pB++ = A[left++];
while (right < right_end)
*pB++ = A[right++];
for (int i=0; i<len; i++)
A[i+low] = B[i];
free(B);
}
void merge_sort_dc(int A[], int left, int right)
{
if (left < right)
{
int mid = (left+right)/2;
merge_sort_dc(A, left, mid);
merge_sort_dc(A, mid+1, right);
merge(A, left, mid, right);
}
}
void test_sort()
{
int arr[] = {1, 9, 4, 5, 8, 6, 0, 3, 2, 7, 98, 73, 23, 63, 7, 45};
printf("before sort:\n");
print_arr(arr, ARR_SIZE(arr));
merge_sort_dc(arr, 0, ARR_SIZE(arr) - 1);
printf("after sort:\n");
print_arr(arr, ARR_SIZE(arr));
}
参考:
http://www.cnblogs.com/ziyiFly/archive/2008/09/10/1288502.html
http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F