【问题标题】:Java recursion and Merge SortJava递归和归并排序
【发布时间】:2010-12-08 23:00:40
【问题描述】:

我正在尝试用 Java 编写一个简单的合并排序程序,我在 Eclipse 中看到很多红色。我还是个初学者,不太明白哪里出了问题。谢谢。

-凯尔

public class merge{ 
public static int[] mergeSub(int[] array, int left, int right){
        if(left<right)
        {
        int mid = (left+right)/2;
        int[] a = mergeSub(array, left, mid);
        int [] b = mergeSub(array, mid+1, right);
        return merge(a, b);

}
        int[] arr=new int[1];
        arr[0]=arr[left];
        return arr;
}

static int[] merge(int[] left, int[] right){
        int index =0; int indexLeft =0; int indexRight=0;
        int[] result = new int[left.length+right.length];

        while(indexLeft<left.length && indexRight<right.length){
                if(left[indexLeft] <= right[indexRight])
                {
                        result[index]=left[indexLeft];
                        index++;
                        indexLeft++;

                }
                else{
                        result[index]=right[indexRight];
                        index++;
                        indexRight++;
                }
        }

        if (indexLeft<left.length){
                while(indexLeft<left.length){
                        result[index]=left[indexLeft];
                        indexLeft++; index++;
                }
        }
        if (indexRight<right.length){
                while(indexRight<left[indexRight]){
                        result[index]=right[indexRight];
                        indexRight++; right[indexRight]++;
                }
        }
        return result;
}



public static void main(String args[]){

        int[] array = {2, 4, 5, 7, 5, 6, 3, 5, 7, 8};
        System.out.println(mergeSub(array, 0, 9));
}}

【问题讨论】:

  • 如果你能描述一两个更常见的错误会更容易。
  • 我不确定,eclipse 好像可以编译但是还是有问题
  • 花时间正确缩进你的代码。这将使其更具可读性和可理解性,并暴露出广泛的错误。 Eclipse 可以帮助您使用可以配置的标准自动格式化,直到您找到您的“风格”。我只是拒绝检查格式不一致的代码。这包括我辅导的时候。
  • 将您的问题更新为最新版本的代码。如果您仍然有麻烦,我可以发布一个工作版本。还是希望你自己解决。

标签: java merge sorting mergesort


【解决方案1】:

您应该首先在 Eclipse 中减少它的红色 :-)

当您将鼠标悬停在错误上时,它会告诉您错误是什么。例如,在您的mergeSub 代码中,您将leftright 声明为本地数组,即使leftright 已经声明为int 参数。以不同的方式命名您的局部变量。

冲洗并重复。

【讨论】:

    【解决方案2】:

    我的 Java 有点生疏了,但我相信在 Java 中,一切都必须在一个类中。您似乎没有在代码示例中声明任何类,但也许您只是为了简洁而忽略了它们?

    【讨论】:

    • 好的,创建了一个名为merge的类,同样来自第一个答案
    【解决方案3】:

    首先...您的主函数 mergeSub 被声明为静态函数(这很好),但您不能调用非静态函数。要么将 merge 设为静态,要么将 mergeSub 设为包含类的方法。

    【讨论】:

    • 我添加了一个类合并,应该这样做吗?
    【解决方案4】:

    复制/粘贴是你的恶行。我不想展示整个工作代码,所以:

    在合并子中:

    arr[0]=arr[left]; should be arr[0]=array[left];
    

    在合并中:

    while(indexRight < left[indexRight]) should be while(indexRight < right.length)
    
    right[indexRight]++; should be index++;
    

    也许还有更多。哦,你不能用 println() 打印一个数组,你必须遍历它。

    【讨论】:

    • 你也可以使用 Arrays.toString(array) 打印一个数组
    【解决方案5】:

    我可以看到一个问题(虽然它没有解释编译时错误):

    mergeSub() 不检查是否传递了一个空数组。如果你传递一个空数组,你会在arr[0]=array[left]; statemnt 处得到一个ArrayIndexOutOfBoundsException

    【讨论】:

      【解决方案6】:

      在您摆脱红色后,根据所提供的反馈,您可以将您的实现与此one@codecodex.com 进行比较,以了解它如何叠加并了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 2013-03-15
        • 2020-03-04
        • 2016-04-14
        • 2015-06-17
        • 2016-04-19
        • 2018-07-26
        相关资源
        最近更新 更多