一、算法实现
归并排序的时间复杂度为O(nlgn),其代码实现如下:
int merge_sort(int *array, int min, int max)
{
int mid = (min+max)/2;
if(max <= min) return 0;
merge_sort(array, min, mid);
merge_sort(array, mid+1, max);
merge(array, min, mid, max);
return 0;
}
int merge(int *array, int min, int mid, int max)
{
int i=0, j=0, idx=0;
int lnum = mid-min+1, rnum = max-mid;
char *L=NULL, *R=NULL;
L = calloc(1, lnum*sizeof(int));
if(NULL == L)
{
return -1;
}
R = calloc(1, rnum*sizeof(int));
if(NULL == R)
{
return -1;
}
/* Set L and R array */
for(i=0; i<lnum; i++)
{
L[i] = array[min+i];
}
for(j=0; j<rnum; j++)
{
R[j] = array[mid+1+j];
}
/* Sort */
i = 0;
j = 0;
idx = min;
while(i<lnum && j<rnum)
{
if(L[i] <= R[j])
{
array[idx++] = L[i++];
}
else
{
array[idx++] = R[j++];
}
}
if(i < lnum)
{
for(; i<lnum; i++)
{
array[idx++] = L[i];
}
}
else
{
for(; j<rnum; j++)
{
array[idx++] = R[j];
}
}
free(L), L=NULL;
free(R), R=NULL;
return 0;
}
二、函数调用
#define ARRAY_NUM (10)
int main(int argc, void *argv[])
{
int idx=0;
int array[ARRAY_NUM] = {0, 9, 8, 7, 6, 5, 4, 3, 2, 1};
merge_sort(array, 0, ARRAY_NUM-1);
for(idx=0; idx<ARRAY_NUM; idx++)
{
fprintf(stdout, "array[%d] = %d\n", idx, array[idx]);
}
return 0;
}