package leetcode.sort;
import java.util.Arrays;
public class MergeSort {
public static void merge(int[] a, int low, int mid, int high) {
//1、high-low+1 就是本次要合并的两个数组的长度之和,low代表左边的有序数组在a中最左边的实际位置
//high 代表右边的有序数组的最右边的指针,这里的两个数组实际上是通过指针来划分的
// low->mid 代表左边的数组,mid+1->high 代表右边的数组
//所以两个数组都从最左边的指针的位置开始比较即可
//2、先a数组赋值给temp数组,然后temp数组赋值给a数组
int[] temp = new int[high - low + 1];
int i = low;// 左指针
/*M: j = high */
int j = mid + 1;// 右指针(要合并的第二个数组的最左边的指针)
int k = 0;
// 把较小的数先移到新数组中
/* M:i <=low*/
while (i <= mid && j <= high) {
if (a[i] <= a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while (i <= mid) {
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
// low 指针就是在数组a中的实际位置
/* M:temp[k2]写成了a[k2] */
for (int k2 = 0; k2 < temp.length; k2++) {
a[k2 + low] = temp[k2];
}
}
public static void mergeSort(int[] a, int low, int high) {
int mid = (low + high) / 2;
/* M : 没有写if条件*/
if (low < high) {
// 左边
mergeSort(a, low, mid);
// 右边
mergeSort(a, mid + 1, high);
// 左右归并
merge(a, low, mid, high);
System.out.println(Arrays.toString(a));
}
}
public static void main(String[] args) {
int a[] = {51, 46, 20, 18, 65, 97, 82, 30, 77, 50};
mergeSort(a, 0, a.length - 1);
System.out.println("排序结果:" + Arrays.toString(a));
}
}
归并排序
最新推荐文章于 2024-12-15 17:47:59 发布