我试图在Java中实现一些排序算法,作为教育过程在int-arrays上工作。我目前试图围绕合并排序。昨天我走得很远,结果是一个正确大小的数组,但只包含零。今天我从地面开始新的,现在我陷入了同样的困境。 ^^ 这是我的代码:
public static int[] mergeSort(int[] array) {
if (array.length < 2) {
return array;
}
int left = 0;
int right = array.length;
int p = array.length / 2;
int[] lArray = Arrays.copyOfRange(array, left, p);
int[] rArray = Arrays.copyOfRange(array, p, right);
lArray = mergeSort(lArray);
rArray = mergeSort(rArray);
return merge(lArray, rArray);
}
private static int[] merge(int[] lArray, int[] rArray) {
int[] result = new int[lArray.length + rArray.length];
int idx = 0;
int rIdx = 0;
int lIdx = 0;
while (lIdx < lArray.length - 1 && rIdx < rArray.length - 1) {
if (lArray[lIdx] < rArray[rIdx]) {
result[idx] = lArray[lIdx];
lIdx++;
} else if (lArray[lIdx] >= rArray[rIdx]) {
result[idx] = rArray[rIdx];
rIdx++;
}
idx++;
}
if (lIdx < (lArray.length - 1)) {
result[idx] = lArray[lIdx + 1];
} else if (rIdx < (rArray.length - 1)) {
result[idx] = rArray[rIdx + 1];
}
return result;
}
我觉得它很漂亮,风格可读。所以,你所有的算法和Java都在那里破解,我错过了什么?调试指向合并方法,但我无法将其固定,因此我按原样发布。
提前致谢!
答案 0 :(得分:1)
我在merge
方法中看到了两个问题:
首先,while循环忽略左右数组的最后一个元素。你应该改变
while (lIdx < lArray.length - 1 && rIdx < rArray.length - 1)
到
while (lIdx < lArray.length && rIdx < rArray.length)
其次,在循环之后,你还需要两个while循环来添加左数组的尾部或右数组的尾部。相反,您只需添加一个元素。
替换
if (lIdx < (lArray.length - 1)) {
result[idx] = lArray[lIdx + 1];
} else if (rIdx < (rArray.length - 1)) {
result[idx] = rArray[rIdx + 1];
}
与
while (lIdx < lArray.length) {
result[idx++] = lArray[lIdx++];
}
while (rIdx < rArray.length) {
result[idx++] = rArray[rIdx++];
}
答案 1 :(得分:0)
if (lIdx < (lArray.length - 1)) {
result[idx] = lArray[lIdx + 1];
} else if (rIdx < (rArray.length - 1)) {
result[idx] = rArray[rIdx + 1];
}
这部分有点奇怪。为什么只将一个剩余元素复制到结果数组中?您应该将lArray或rArray中的所有剩余元素复制到结果中。使用&#39; while&#39;而不是&#39;如果&#39;。
答案 2 :(得分:0)
你去吧
public class MergeSort {
public static int[] mergeSort(int[] array) {
if (array.length < 2) {
return array;
}
int left = 0;
int right = array.length;
int p = array.length / 2;
int[] lArray = Arrays.copyOfRange(array, left, p);
int[] rArray = Arrays.copyOfRange(array, p, right);
//printArray(lArray); seems ok
//printArray(rArray); seems ok
lArray = mergeSort(lArray);
rArray = mergeSort(rArray);
return merge(lArray, rArray);
}
private static int[] merge(int[] lArray, int[] rArray) {
/*System.out.println("Ive got");
printArray(lArray);
printArray(rArray); seems ok*/
int[] result = new int[lArray.length + rArray.length];
int index = 0;
int rightIndex = 0;
int leftIndex = 0;
while (leftIndex < lArray.length && rightIndex < rArray.length) { //TODO
if (lArray[leftIndex] < rArray[rightIndex]) {
result[index] = lArray[leftIndex];
leftIndex++;
index++;
//} else if (lArray[leftIndex] >= rArray[rightIndex]) { // You don't have to check it!!!
} else {
System.out.println("2 left index " + leftIndex + " index " + index);
result[index] = rArray[rightIndex];
rightIndex++;
index++;
}
}
while (leftIndex < (lArray.length)) { // TODO
result[index] = lArray[leftIndex];
index++;
leftIndex++;
}
while (rightIndex < (rArray.length)) { // TODO
result[index] = rArray[rightIndex];
index++;
rightIndex++;
}
System.out.println("Returning ");
printArray(result);
return result;
}
public static void printArray(int[] arr) {
for (int i : arr)
System.out.print(i + " ");
System.out.println();
}
public static void main(String[] args) {
int[] arr = {2, 1, 3, 4, 0, -1};
printArray(arr);
arr = mergeSort(arr);
printArray(arr);
}
}
标有//TODO