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];
}
}
}