Skip to content

Commit e3897a0

Browse files
author
huoda
committed
添加哨兵合并数组方法
1 parent 2280169 commit e3897a0

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

java/12_sorts/MergeSort.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,40 @@ private static void merge(int[] a, int p, int q, int r) {
5757
}
5858
}
5959

60+
/**
61+
* 合并(哨兵)
62+
*
63+
* @param arr
64+
* @param p
65+
* @param q
66+
* @param r
67+
*/
68+
private static void mergeBySentry(int[] arr, int p, int q, int r) {
69+
int[] leftArr = new int[q - p + 2];
70+
int[] rightArr = new int[r - q + 1];
71+
72+
for (int i = 0; i <= q - p; i++) {
73+
leftArr[i] = arr[p + i];
74+
}
75+
// 第一个数组添加哨兵(最大值)
76+
leftArr[q - p + 1] = Integer.MAX_VALUE;
77+
78+
for (int i = 0; i < r - q; i++) {
79+
rightArr[i] = arr[q + 1 + i];
80+
}
81+
// 第二个数组添加哨兵(最大值)
82+
rightArr[r-q] = Integer.MAX_VALUE;
83+
84+
int i = 0;
85+
int j = 0;
86+
int k = p;
87+
while (k <= r) {
88+
// 当左边数组到达哨兵值时,i不再增加,直到右边数组读取完剩余值,同理右边数组也一样
89+
if (leftArr[i] <= rightArr[j]) {
90+
arr[k++] = leftArr[i++];
91+
} else {
92+
arr[k++] = rightArr[j++];
93+
}
94+
}
95+
}
6096
}

0 commit comments

Comments
 (0)