Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fd6155a

Browse files
gallonyinhustcc
authored andcommitted
优化归并排序空间使用(减少不必要copy) (#22)
1 parent 6c42a49 commit fd6155a

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

‎src/java/main/MergeSort.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,25 @@ public int[] sort(int[] sourceArray) throws Exception {
2323

2424
protected int[] merge(int[] left, int[] right) {
2525
int[] result = new int[left.length + right.length];
26-
int i = 0;
27-
while (left.length > 0 && right.length > 0) {
28-
if (left[0] <= right[0]) {
29-
result[i++] = left[0];
30-
left = Arrays.copyOfRange(left, 1, left.length);
26+
int l = 0, r = 0, len = 0;
27+
while (len < left.length + right.length) {
28+
if (left[l] <= right[r]) {
29+
result[len++] = left[l++];
30+
31+
if (l == left.length) {
32+
for (int i = r; i < right.length; i++) {
33+
result[len++] = right[r++];
34+
}
35+
}
3136
} else {
32-
result[i++] = right[0];
33-
right = Arrays.copyOfRange(right, 1, right.length);
34-
}
35-
}
37+
result[len++] = right[r++];
3638

37-
while (left.length > 0) {
38-
result[i++] = left[0];
39-
left = Arrays.copyOfRange(left, 1, left.length);
40-
}
41-
42-
while (right.length > 0) {
43-
result[i++] = right[0];
44-
right = Arrays.copyOfRange(right, 1, right.length);
39+
if (r == right.length) {
40+
for (int i = l; i < left.length; i++) {
41+
result[len++] = left[l++];
42+
}
43+
}
44+
}
4545
}
4646

4747
return result;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /