归并排序
来源:互联网 发布:快递热敏打印软件 编辑:程序博客网 时间: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
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Android的安全问题
- react-Native ListView中实现单击行展开效果
- 希尔排序
- linux下怎么安装chrome浏览器
- apt-get使用代理
- 归并排序
- lightoj 1085 All Possible Increasing Subsequences(递推式+离散化+树状数组维护)
- 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
- 冒泡排序与简单排序
- Android四大组件之------Service
- 完美解决 ListView偶尔爆出的异常:java.lang.IllegalStateException
- Group By的介绍
- 混淆与反编译
- HDU 5919 分块做法