commit
355020464a
@ -57,4 +57,40 @@ public class MergeSort {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并(哨兵)
|
||||
*
|
||||
* @param arr
|
||||
* @param p
|
||||
* @param q
|
||||
* @param r
|
||||
*/
|
||||
private static void mergeBySentry(int[] arr, int p, int q, int r) {
|
||||
int[] leftArr = new int[q - p + 2];
|
||||
int[] rightArr = new int[r - q + 1];
|
||||
|
||||
for (int i = 0; i <= q - p; i++) {
|
||||
leftArr[i] = arr[p + i];
|
||||
}
|
||||
// 第一个数组添加哨兵(最大值)
|
||||
leftArr[q - p + 1] = Integer.MAX_VALUE;
|
||||
|
||||
for (int i = 0; i < r - q; i++) {
|
||||
rightArr[i] = arr[q + 1 + i];
|
||||
}
|
||||
// 第二个数组添加哨兵(最大值)
|
||||
rightArr[r-q] = Integer.MAX_VALUE;
|
||||
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
int k = p;
|
||||
while (k <= r) {
|
||||
// 当左边数组到达哨兵值时,i不再增加,直到右边数组读取完剩余值,同理右边数组也一样
|
||||
if (leftArr[i] <= rightArr[j]) {
|
||||
arr[k++] = leftArr[i++];
|
||||
} else {
|
||||
arr[k++] = rightArr[j++];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user