归并排序的基本思想是:首先对待排序数组前 n/ 2排序,再对后n / 2排序,然后对两部分进行合并
流程:1、若n= 1,返回
2、对前n / 2排序
对后n / 2 排序
3、合并
时间复杂度为:O(nlgn),推导方法见http://v.163.com/special/opencourse/algorithms.html 麻省理工学院开放课 --算法导论(国外的教学真的比国内的好很多)
/*归并排序: 时间复杂度:O(nlgn) */ #include<stdio.h> #include<stdlib.h> #include<string.h> void MergeSort(int data[],int length) { int *tempdata; int i = 0; int nHead1 = 0; int nHead2 = 0; if(length == 1) { return; } MergeSort(data,(int)(length / 2)); MergeSort(data + (int)(length / 2),length - (int)(length / 2)); tempdata = (int*)malloc(length * sizeof(int)); nHead1 = 0; nHead2 = length / 2; for(i = 0;i < length;++i) { if(nHead2 == length || ((nHead1 < (int)(length / 2)) && data[nHead1] < data[nHead2])) { tempdata[i] = data[nHead1++]; } else { tempdata[i] = data[nHead2++]; } } memcpy(data,tempdata,length * sizeof(int)); } int main() { int data[15] = {4,7,2,6,5,9,3,8,19,11,14,12,17,20,18}; int i = 0; MergeSort(data,15); for(i = 0;i < 15;i++) { printf("%d ",data[i]); } printf("\n"); getchar(); return 0; }