hanyujianke 2020-05-25
归并排 就是一种分治的思想
将某个问题划分为n个小的同规模算法去解决
public class StudyMergeSort { /** * 归并排思路 : * 将一个数组分割成n个小组 然后每个小组两两比较 */ public static void main(String[] args) { int[] array = ArrayUtil.generateRandomArray(20, 20); ArrayUtil.printArray(array); mergeSort(array); System.out.println(); ArrayUtil.printArray(array); } public static void mergeSort(int[] arr) { process(arr,0,arr.length-1); } public static void process(int[] arr, int L, int R) { if(L == R){ return; } /** 中间数 */ int M = L + ((R - L) >> 1); /** 分裂 */ process(arr,L,M); process(arr,M+1,R); /** 合并 */ merge(arr,L,M,R); } public static void merge(int[] arr, int L, int M, int R){ int i = 0; int p1 = L; int p2 = M + 1; /** 辅助空间 */ int [] help = new int [R - L + 1]; /** 将小的放到辅助空间中 */ while(p1 <= M && p2 <= R){ help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; } while(p1 <= M){ help[i++] = arr[p1++]; } while(p2 <= R){ help[i++] = arr[p2++]; } for (int j = 0; j < help.length; j++) { arr[L+j] = help[j]; } } }