算法导论2.3MERGE-SORT(分治或者合并排序算法)
2016-09-29 22:35
260 查看
public static void main(String[] args) { int[] s = {3, 2, 4, 5, 7, 6, 1}; //注意下标的选取,用伪代码都需要+1 sort(s,0,6); print(s); } private static void print(int[] s){ for (int i = 0; i < s.length; i++) { if(i == 0){ System.out.print("{"); } System.out.print(s[i]); if(i < s.length -1){ System.out.print(","); } if(i == s.length -1){ System.out.print("}\n"); } } } private static void sort(int[] s , int p ,int r){ //只要p<r说明还可以继续分解 if(p < r ){ //取不大于(p+r)/2的最大整数 int q = (p+r)/2 ; //排序下标为p到q的元素 sort(s,p,q); //排序下标为q+1到r的元素 sort(s,q+1,r); //合并 sortMegre(s,p,q,r); } } //哨兵牌处理子数组的结束 private static void sortMegre(int[] s , int p , int q , int r){ int n1 = q-p+1; int n2 = r-q; int[] L = new int[n1+1]; int[] R = new int[n2+1]; for (int i = 0; i < L.length-1; i++) { L[i] = s[p+i]; } for (int i = 0; i < R.length-1; i++) { R[i] =s[q+i+1]; } //哨兵牌 L[n1] =Integer.MAX_VALUE; R[n2] =Integer.MAX_VALUE; int j =0; int k = 0; for (int i = p; i <= r; i++) { if(L[j] <=R[k]){ s[i] = L[j]; j++; }else{ s[i] = R[k]; k++; } } //没有哨兵牌的排序方法 private static void sortMegreNosentinal(int[] s , int p , int q , int r){ int n1 = q-p+1; int n2 = r-q; int[] L = new int[n1]; int[] R = new int[n2]; for (int i = 0; i < L.length; i++) { L[i] = s[p+i]; } for (int i = 0; i < R.length; i++) { R[i] =s[q+i+1]; } int j =0; int k = 0; int i ; for ( i = p; i <= r; i++) { //如果大于子数组的最大下标则说明子数组已经空了 if(j > n1-1 || k > n2-1){ break; } if(L[j] <=R[k]){ s[i] = L[j]; j++; }else{ s[i] = R[k]; k++; } } //左侧为空 if(j > n1-1){ //将右侧剩余的列表赋值给s for ( int m = 0; m < r-i+1; m++) { s[i+m] = R[k+m]; } } //右侧为空 if(k > n2-1 ){ //将左侧剩余的列表赋值给s for ( int m = 0; m < r-i+1; m++) { s[i+m] = L[j+m]; } } }
注意事项详见注释吧
这个排序方法原理不是特别的麻烦
但写起来很麻烦
问题主要是在下标的处理
伪代码是从1开始
而java都是从0开始计算的
但是我觉得掌握到原理还是比较简单的
另外需要注意这里的下标p,q,r都是包含的关系,可能和我们平时写代码的习惯不一样,这是个不小的坑
哨兵牌我没有找到无穷大怎么表示,只能暂时用int的最大值来表示,这点可能会有隐患,不过还好有不需要哨兵牌的表达方式,虽然写起来稍微有点麻烦
没想到写算法也会让人沉迷.
睡了
相关文章推荐
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 【算法导论】2-1 插入排序insertion-sort.cpp
- 读书笔记:算法导论第2章 第1节 Insertion sort
- 求最大子数组的和,算法导论之分治递归求解,暴力求解,记忆扫描方法。
- 二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
- 算法导论:分治法,python实现合并排序MERGE-SORT
- 【算法导论学习-013】堆排序(Heapsort)
- algorithm: heap sort in python 算法导论 堆排序
- merge_sort相比算法导论简易版本实现
- [算法导论]merge sort @ Python
- Algorithm: quick sort implemented in python 算法导论 快速排序
- 【算法导论学习-014】计数排序(CountingSortTest)
- 算法导论2-4习题解答(合并排序算法)
- 算法导论实验四_分治法求平面上的最小点对
- quick_sort <算法导论>实现
- 【算法导论】 第二章 插入排序、分治排序
- 【算法导论】分治法及归并排序
- 算法导论—快排及优化以及和STL sort 的比较
- 【算法导论学习-015】基数排序(Radix sort)
- 算法导论-----分治策略----------求最大子数组