思路:将一个数组左右均分,两侧排好序,再利用外排整体排序
//归并排序从小到大
public class MergeSort {
public static void merge(int[] arr, int l, int m, int r) {
int[] help = new int[r - l + 1];// 辅助数组,用于外排
int p1 = l, p2 = m + 1;// 定义两个指针,分别对左右两边的数遍历
int i = 0;
while (p1 <= m && p2 <= r) {// 左右两边第一个数谁小把谁放到help,然后它的指针向后移动
if (arr[p1] <= arr[p2]) {
help[i] = arr[p1];
i++;
p1++;
} else {
help[i] = arr[p2];
i++;
p2++;
}
}
while (p1 <= m) {// 右边已经为空
help[i] = arr[p1];
i++;
p1++;
}
while (p2 <= r) {// 左边为空
help[i] = arr[p2];
i++;
p2++;
}
for (int j = l; j < help.length; j++) {
arr[j] = help[j];
}
}
public static void mergeSort(int[] arr, int l, int r) {
if (l == r) {// 递归中止条件
return;
}
int mid = (l + r) / 2;
mergeSort(arr, l, mid);// 对左边递归排序
mergeSort(arr, mid + 1, r);// 右边递归排序
merge(arr, l, mid, r);// 左右进行归并
}
public static void main(String[] args) {
int arr[] = { 3, 1, 5, 7, 22, 11, 77, 34, 65 };
mergeSort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.println(i);
}
}
}