import java.util.Arrays;
class MergeSort {
public static int[] merge(int[] left, int[] right) {
// Initial indexes of first and second subarrays
int[] arr = new int[left.length right.length];
int countLeft = 0;
int countRight = 0;
// TODO Complete the method
while (countLeft < left.length && countRight < right.length) {
if (left[countLeft] < right[countRight]) {
arr[countLeft] = left[countLeft];
countLeft ;
} else {
arr[countRight] = left[countRight];
countRight ;
}
}
while (countLeft < left.length) {
arr[countLeft] = left[countLeft];
countLeft ;
}
while (countRight < right.length) {
arr[countRight] = left[countRight];
countRight ;
}
return arr;
}
public static int[] sort(int arr[]) {
// Find the middle point
if (arr.length > 1) {
int m = arr.length / 2;
int[] l1 = Arrays.copyOfRange(arr, 0, m);
int[] l2 = Arrays.copyOfRange(arr, m, arr.length);
l1 = sort(l1);
l2 = sort(l2);
return merge(l1, l2);
} else {
return arr;
}
}
public static void main(String[] args) {
int [] arr = {1, 6, 64, 3, 7, 3, 7};
// sort(arr);
MergeSort ob = new MergeSort();
ob.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at um.MergeSort.merge(MergeSort.java:28)
at um.MergeSort.sort(MergeSort.java:44)
at um.MergeSort.sort(MergeSort.java:41)
at um.MergeSort.main(MergeSort.java:55)
有誰知道我為什么越界?(我知道越界是什么意思,我只是不知道為什么我有它)。
根據這應該是第 28 行中對應的越界arr[countRight] = left[countRight];但為什么呢?
uj5u.com熱心網友回復:
合并函式 :public static int[] merge不正確。
一個明顯的錯誤是arr[countRight] = left[countRight]。您的countRight變數可以增加超出left陣列的容量,countRight < right.length但不是 countRight < left.length。
所以在else條件下它應該是:arr[countRight] = right[countRight]。
另外,我個人會推薦一個新變數來迭代 new arrarr而不是arr[countRight]or arr[countLeft],因為它更容易理解/除錯。
int i = 0; //new variable
while (countLeft < left.length && countRight < right.length) {
if (left[countLeft] < right[countRight]) {
arr[i] = left[countLeft];
countLeft ;
i ;
} else {
arr[i] = right[countRight];
countRight ;
i
}
}
相應地更改其他 while 回圈。
uj5u.com熱心網友回復:
這對我來說像是一個復制和粘貼錯誤。我相信你的意思是:
arr[countRight] = right[countRight];
uj5u.com熱心網友回復:
您需要更改合并方法的實作。在 merge 方法的第三個 while 中,您應該用正確的陣列填充 arr[]。
public static int[] merge(int[] left, int[] right) {
// Initial indexes of first and second subarrays
int[] arr = new int[left.length right.length];
int countLeft = 0;
int countRight = 0;
// TODO Complete the method
while (countLeft < left.length && countRight < right.length) {
if (left[countLeft] < right[countRight]) {
arr[countLeft] = left[countLeft];
countLeft ;
} else {
arr[countRight] = right[countRight];
countRight ;
}
}
while (countLeft < left.length) {
arr[countLeft] = left[countLeft];
countLeft ;
}
while (countRight < right.length) {
arr[countRight ] = right[countRight];
countRight ;
}
return arr;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435776.html
