算法导论 之 归并排序[C语言]

来源:互联网 发布:企业域名保护 编辑:程序博客网 时间:2024/04/28 08:06

一、算法实现

归并排序的时间复杂度为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;}



原创粉丝点击