public class GBQuery {
public static void fen(int[] arr, int L, int R) {
if (L == R || arr.length == 0) {
return;
}
//取数组的中间索引
int mid = (L + R) / 2;
//将数组分为长度为一的数组
fen(arr, L, mid);
fen(arr, mid + 1, R);
//将L到mid的左边数组与mid+1到R的右边数组进行排序,这里可以理解为左右两边的数组已经排好序(长度为1时 )
PaiXuL_R(arr, L, R, mid);
}
//此方法是对已经排好序的两个数组进行排序,(mid的左边包含mid)和右边(不包含mid)
public static void PaiXuL_R(int[] arr, int L, int R, int mid) {
//临时数组用来存储L-R的值(将两个有序数组进行排序后的值)
int[] tem = new int[R - L + 1];
int Li = L;
int Ri = mid + 1;
int TEMi = 0;
//将两个数组中的较小的数放入临时数组
while (Li <= mid && Ri <= R) {
tem[TEMi++] = arr[Li] < arr[Ri] ? arr[Li++] : arr[Ri++];
}
//如果mid左边的值没有全部放如临时数组,将其全部放入(如果左边没有全部放入,那么右边一定完全放入,否则相反)
while (Li <= mid) {
tem[TEMi++] = arr[Li++];
}
//如果mid右边的值没有全部放如临时数组,将其全部放入
while (Ri <= R) {
tem[TEMi++] = arr[Ri++];
}
//将临时数组中的值放回原数组中
for (int i = 0; i < tem.length; i++) {
arr[L + i] = tem[i];
}
}
public static int[] creatArr() {
//生成长度随机的数组
int[] arr = new int[(int) (Math.random() * 100)];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 100 - Math.random() * 59);
}
fen(arr, 0, arr.length - 1);
return arr;
}
public static void main(String[] args) {
int[] a = creatArr();
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}