// 注意返回 void
public void mergeSortHelper(int[] arr, int l, int r){
if(l >= r) return;
// 先分;神坑2:注意 m 归左边
int m = (l + r) / 2;
mergeSortHelper(arr, l, m);
mergeSortHelper(arr, m + 1, r);
// 后治
merge(arr, l, m, r);
}
// 注意返回 void
public void merge(int[] arr, int l, int m, int r){
// 创建临时数组
int[] arrTemp = new int[r - l + 1];
int p = 0;
// 创建双指针,边界条件
int p1 = l, p2 = m + 1, end1 = m, end2 = r;
// 双指针 while;都未遍历完,某个未遍历完
while(p1 <= end1 || p2 <= end2){
if(p1 <= end1 && p2 <= end2){
if(arr[p1] <= arr[p2]) arrTemp[p++] = arr[p1++];
else if(arr[p1] > arr[p2]) arrTemp[p++] = arr[p2++];
}
else if(p2 > end2) arrTemp[p++] = arr[p1++];
else if(p1 > end1) arrTemp[p++] = arr[p2++];
// 神坑1:必须加 else;第一个if完,p1已经++了,可能会继续进入第二个if
// if(p2 > end2) arrTemp[p++] = arr[p1++];
// if(p1 > end1) arrTemp[p++] = arr[p2++];
}
// 将临时数组移到 arr 上
for(int i = l; i <= r; i++) arr[i] = arrTemp[i - l];
}
算法;归并
最新推荐文章于 2023-09-25 20:15:30 发布