原理
先进行两两拆分,拆分至无法拆分为止,在进行两两合并,通过比较按顺序进行合并,合并成有序数组,合并到最后到只剩下一组数据为止。
代码
// 主方法
public static void merger(int[] arr) {
merger(arr, 0, arr.length-1);
}
// 拆分方法
public static void merger(int[] arr, int left, int right) {
if(left >= right) return;
// 拆分
merger(arr, left, (left+right)/2);
merger(arr, (left+right)/2+1, right);
// 归并
merger(arr, left, (left+right)/2,right);
}
// 归并方法
public static void merger(int[] arr, int left, int middle, int right) {
int l = left;
int m = middle+1;
int t = 0;
int length = right - left;
int[] temp = new int[length+1];
while(l <= middle && m <= right) {
if(arr[l] <= arr[m]) {
temp[t] = arr[l];
l++;
} else {
temp[t] = arr[m];
m++;
}
t++;
}
while(m <= right) {
temp[t] = arr[m];
m++;
t++;
}
while(l <= middle) {
temp[t] = arr[l];
l++;
t++;
}
for (int i = left,j = 0; i <= right; i++,j++) {
arr[i] = temp[j];
}
}
详细讲解
~~待补充