归并排序

来源:互联网 发布:快递热敏打印软件 编辑:程序博客网 时间:2024/06/11 04:05

归并排序,通过一一排序使得两个相邻的数字有序,二二排序使得四个相邻的数字有序,四四排序使得八个相邻的数字有序,通过一定的次数使得整个数组有序。

归并排序是稳定的。归并排序的空间复杂度位O(n),时间复杂度,不管初始数据有序还是乱序,都是要进行向下移动的。

bool mager_once(int *arr, int len, int gap){if (arr==NULL && len<1 && gap<=0){return false;}int e1 = 0;int r1 = e1+gap-1;        int e2 = r1+1;int r2 = (e2+gap-1)<len ? (e2+gap-1):len-1;int *p = (int *)malloc(sizeof(int)*len);assert(p != NULL);int k = 0;while (e2 < len){while(e1<=r1 && e2<=r2)    //用此条件会造成在最后一个值的时候,一个数会跳到下一组的比较中{if (arr[e1] <= arr[e2]){p[k] = arr[e1];e1++;k++;}if (arr[e1] > arr[e2]){p[k] = arr[e2];e2++;k++;}}while(e1<=r1){p[k] = arr[e1];e1++;k++;}while(e2<=r2){p[k] = arr[e2];e2++;k++;}e1 = r2+1;    r1 = e1+gap-1;    e2 = r1+1;r2 = (e2+gap-1)<len ? (e2+gap-1):len-1;}while (e1<len)//将e1中没有复制过去的数据进行复制{p[k] = arr[e1];k++;e1++;}while (len--){arr[len] = p[len];}free(p);return true;}bool mager_sort(int *arr, int len){if(arr == NULL || len<1){return false;}for(int i=1; i<len; i=i*2){mager_once(arr, len, i);}return true;}

0 0
原创粉丝点击