/**
* 归并排序:其本质的思想是,一个长度为n的数组,它是无序的,但如果n=1,那么这个数组就是有序的。
* 归并排序的算法:先将一个长度为n的无序的数组拆分成n个数组,每一个数组的大小是1,
* 那么每一个数组就是有序的,然后让数组两两合并,每两个数组合成一个数组,就是一个有序的数组,
* 最后就变成了一个有序的数组了。我感觉就是拆了合。
* 归并排序:其本质的思想是,一个长度为n的数组,它是无序的,但如果n=1,那么这个数组就是有序的。
* 归并排序的算法:先将一个长度为n的无序的数组拆分成n个数组,每一个数组的大小是1,
* 那么每一个数组就是有序的,然后让数组两两合并,每两个数组合成一个数组,就是一个有序的数组,
* 最后就变成了一个有序的数组了。我感觉就是拆了合。
* */
public static void mergeSort(int[] array, int low, int high) {
if (low!=high) {
int mid = (low+high)/2;
mergeSort(array, low, mid);
mergeSort(array, mid+1, high);
// 上面2个递归是对数组进行拆分
// 将最后拆成大小只有1的数组,然后开始两两合并(合并的时候夹杂了排序)
merge(array, low, mid, high);
}
}
public static void merge(int[] array, int low, int mid, int high) {
int[] temps = new int[high-low+1];
int k=0, i=low, j=mid+1;
while(i<=mid&&j<=high) {
if (array[i]<=array[j]) {
temps[k++] = array[i++];
} else {
temps[k++] = array[j++];
}
}
while(i<=mid) {
temps[k++] = array[i++];
}
while(j<=high) {
temps[k++] = array[j++];
}
for (int temp : temps) {
array[low++] = temp;
}
}