java原地归并排序(inplace)
来源:互联网 发布:如何修改淘宝店名 编辑:程序博客网 时间:2024/05/22 08:25
/* * 原地归并 */public class InPlaceMergeSort { private static void reverse(int[] arr, int i, int j) { while(i < j) { int temp = arr[i]; arr[i++] = arr[j]; arr[j--] = temp; } } // swap [bias, bias+headSize) and [bias+headSize, bias+headSize+endSize) private static void swapAdjacentBlocks(int arr[], int bias, int oneSize, int anotherSize) { reverse(arr, bias, bias + oneSize - 1); reverse(arr, bias + oneSize, bias + oneSize + anotherSize - 1); reverse(arr, bias, bias + oneSize + anotherSize - 1); } private static void inplaceMerge(int arr[], int l, int mid, int r) { int i = l; // 指示左侧有序串 int j = mid + 1; // 指示右侧有序串 while(i < j && j <= r) //原地归并结束的条件。 { while(i < j && arr[i] <= arr[j]) { i++; } int index = j; while(j <= r && arr[j] <= arr[i]) { j++; } swapAdjacentBlocks(arr, i, index-i, j-index); i += (j-index); } } public static void mergeSort(int arr[], int l, int r) { if(l < r) { int mid = (l + r) / 2; mergeSort(arr, l, mid); mergeSort(arr, mid + 1, r); inplaceMerge(arr, l, mid, r); } } private static void print(int[] arr) { for (int i : arr) { System.out.print(i+", "); } System.out.println(); } /* 测试用例 */ public static void main(String[] args) { int[] arr = {3,5,1,7,0,6,9,11}; mergeSort(arr, 0, arr.length-1); print(arr); }}
new额外数组归并
/** * */private static void merge(int[] dest, int[] src, int l, int mid, int r) { int i = l; int p = l; int q = mid + 1; while (p <= mid && q <= r) { if (src[p] <= src[q]) { dest[i++] = src[p++]; } else { dest[i++] = src[q++]; } } while (p <= mid) { dest[i++] = src[p++]; } while (q <= r) { dest[i++] = src[q++]; } // (原[l, r]范围的内容被复制回原数组) i = l; while (i <= r) { src[i] = dest[i++]; } } public static void mergeSort(int[] dest, int[] src, int l, int r) { if (l < r) { int mid = (l + r) / 2; mergeSort(dest, src, l, mid); mergeSort(dest, src, mid + 1, r); merge(dest, src, l, mid, r); } }
阅读全文
0 0
- java原地归并排序(inplace)
- Java版 原地二路归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序变形
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- 原地归并排序
- C++对象的动态建立与释放详解(new和delete)
- 顺序表-查
- 数据结构实验之查找四:二分查找
- Java中的堆内存和栈内存个人见解
- Squid配置代理访问(rhel7.2)
- java原地归并排序(inplace)
- 好久没来CSDN了..
- Java反射机制
- hdu 4540 威威猫系列故事——打地鼠
- 给初学者的RxJava2.0教程(四)
- 中断线程
- Hive metastore三种配置方式
- go 使用 goroutine channel 通信
- 【整理】Cordova 从相册中选择照片/拍照并上传