import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{2,4,1,2,6,7,4,3,3,6,7,3,2,4,5,3,2,23,1,43,2,4,3,22,4,2,-2829};
System.out.println("Before mergeSort: " + Arrays.toString(arr));
mergeSort(arr, 0, arr.length - 1);
System.out.println("After mergeSort: " + Arrays.toString(arr));
}
// 归并排序
public static void mergeSort(int[] array, int lo, int hi) {
if (lo == hi) return;
// 求出中点
int mid = lo + ((hi - lo) >> 1);
// 排序左边的
mergeSort(array, lo, mid);
// 排序右边的
mergeSort(array, mid + 1, hi);
// 归并两边的有序数组
merge(array, lo, mid, hi);
}
// 归并排序中的归并过程,即将两个有序数组通过双指针归并到一起
public static void merge(int[] array, int lo, int mid, int hi) {
// 定义一个辅助的数组helper
int[] helper = new int[hi - lo + 1];
// 定义一个helper使用的索引index
int index = 0;
// 定义指向左右两边的指针
int leftPoint = lo, rightPoint = mid + 1;
// 将两边的数按照最小的依次放到helper中
while (leftPoint <= mid || rightPoint <= hi) {
// 这样比较 可以处理某一边越界的情况 可以少写两个while循环
int leftVal = leftPoint > mid ? Integer.MAX_VALUE : array[leftPoint];
int rightVal = rightPoint > hi ? Integer.MAX_VALUE : array[rightPoint];
helper[index++] = leftVal <= rightVal ? array[leftPoint++] : array[rightPoint++];
}
// 此时helper中的数就是从lo到hi是有序的,将其拷贝回array的对应部分
System.arraycopy(helper, 0, array, lo, hi + 1 - lo);
}
}
08-29