我正在尝试在java中编写mergesort程序。不幸的是,我的实现给出了一个零列表作为代码的结果。我无法找到扭结,因为一切看起来都是合乎逻辑的,而且对我来说是正确的。如果有人能帮我找到这个小故障,我将不胜感激。
代码如下:
package com.company;
public class Main {
public static void main(String[] args) {
int[] array = {35,43,21,4,23,1,13,44};
System.out.println("initial array is equal to:");
for (int data:array) {
System.out.println(data);
}
mergeSort(array, new int[array.length], 0, array.length-1);
System.out.println("Sorted array is equal to: " );
for (int s:array) {
System.out.println(s);
}
// arr = {35,43,21,4,23,1,13,44}
}
public static void mergeSort(int[] array,int[] secondaryArray,int leftStart, int rightEnd){
if(leftStart >= rightEnd){
return;
}
int midPoint = (leftStart + rightEnd) / 2;
//sorting the left array
mergeSort(array, secondaryArray, leftStart, midPoint);
//sorting the right array
mergeSort(array, secondaryArray, midPoint+1, rightEnd);
//merging the sorted left and right array
mergeHalves(array, secondaryArray,leftStart, rightEnd);
}
public static void mergeHalves(int[] array, int[] secondaryArray, int leftStart, int rightEnd){
int leftEnd = (leftStart + rightEnd)/2;
int rightStart = leftEnd + 1;
int index = 0;
while ((leftStart <= leftEnd) && (rightStart <= rightEnd)){
if(array[leftStart] <= array[rightStart]){
secondaryArray[index] = array[leftStart];
leftStart++;
}else {
secondaryArray[index] = array[rightStart];
rightStart++;
}
index++;
}
System.arraycopy(array,rightStart,secondaryArray,index,rightEnd-rightStart+1);
System.arraycopy(array,leftStart,secondaryArray,index,leftEnd-leftStart+1);
System.arraycopy(secondaryArray,0,array,0,secondaryArray.length);
}
}
答案 0 :(得分:0)
尝试使用您控制的样本输入运行每个部分并查看您获得的内容。例如,使用不同的输入数组运行mergeHalves
,看看你是否得到了你期望的结果。
你可以做的另一件事是让mergeHalves
在每次调用时打印输入和最终结果。然后使用小样本(空数组,包含1个元素的数组,包含2个元素的数组等)调用mergeSort
,您很快就会明白代码实际上在做什么。
答案 1 :(得分:0)
mergeHalves
中有一个小错误,您的最终数组副本是
System.arraycopy(secondaryArray,0,array,0,secondaryArray.length);
应该是什么时候(假设leftStartCopy是在mergeHalves
期间未更改的leftStart的副本):
System.arraycopy(secondaryArray,0,array,leftStartCopy,rightEnd-leftStartCopy+1);
问题在于您将所有secondaryArray
复制到array
,而不仅仅是相关的单元格。这就是array
充满0的原因。
以下是mergeHalves的完整代码:
public static void mergeHalves(int[] array, int[] secondaryArray, int leftStart, int rightEnd){
int leftStartCopy = leftStart;
int leftEnd = (leftStart + rightEnd)/2;
int rightStart = leftEnd + 1;
int index = 0;
while ((leftStart <= leftEnd) && (rightStart <= rightEnd)){
if(array[leftStart] <= array[rightStart]){
secondaryArray[index] = array[leftStart];
leftStart++;
}else {
secondaryArray[index] = array[rightStart];
rightStart++;
}
index++;
}
System.arraycopy(array,rightStart,secondaryArray,index,rightEnd-rightStart+1);
System.arraycopy(array,leftStart,secondaryArray,index,leftEnd-leftStart+1);
System.arraycopy(secondaryArray,0,array,leftStartCopy,rightEnd-leftStartCopy+1);}