在java中的递归mergesort中的一个小转折

时间:2017-08-13 11:44:09

标签: java

我正在尝试在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);

}
}

2 个答案:

答案 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);}