归并排序
2016-10-25 01:12
155 查看
归并排序,通过一一排序使得两个相邻的数字有序,二二排序使得四个相邻的数字有序,四四排序使得八个相邻的数字有序,通过一定的次数使得整个数组有序。
归并排序是稳定的。归并排序的空间复杂度位O(n),时间复杂度,不管初始数据有序还是乱序,都是要进行向下移动的。
归并排序是稳定的。归并排序的空间复杂度位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; }
相关文章推荐
- 新手讲排序:归并排序
- 排序--5.归并排序
- 归并排序(视频+详解+代码)
- 排序算法五—归并排序
- 归并排序
- 排序算法之归并排序
- 归并排序模板w(kl)
- [BZOJbegin][NOIP十连测第三场]平均数(二分+归并排序求逆序对)
- 归并排序(递归和非递归)
- 关于Matrix归并排序的想法
- 归并排序
- c语言简单实现 冒泡,插入,选择,归并排序
- 第十六周项目1-(7)验证算法归并排序
- 【第十六周 项目1(5)—归并排序】
- Daily 排序之归并排序
- 归并排序+一个编程需要注意的地方
- 简单的分治——归并排序
- 用python实现归并排序
- nyoj 求逆序数(归并排序)
- [算法入门]归并排序非递归实现,大家一起来找茬啊~