Java:为什么我的递归排序方法不起作用?

时间:2019-03-12 14:06:08

标签: java arrays sorting recursion bubble-sort

我在下面编写的递归排序方法在使用典型的sout时会打印地址(“ [I @ 7852e922”),我认为这与我在sort()中的返回值有关。我试图使该方法无效,但这似乎也不起作用,原因是我需要删除返回值。但是,当我最终用这个烂摊子替换它时,它会打印出未排序的数组,因此我的方法无效:

System.out.println(Arrays.toString(sort(array2, array2.length-1)));

请对我放松,因为由于对先决条件的培训不足,我在编程/递归中一直处于挣扎状态,并且在编写本文之前10分钟就学会了典型的冒泡排序方式。这是我的整个测试程序:

TL; DR:我的排序方法有什么问题,应该如何打印?

public static void main(String[] args) {
    int array2[] = new int[]{1, 3, 5, 2, 4};
    System.out.println(Arrays.toString(sort(array2, array2.length-1)));
}

    static public int[] sort(int[] array, int n) {
    int i = array[n];
    int j = i-1;
    int temp;
    if(n == 0) {
        return array;
    } else if(i < j) {
        temp = i;
        i = j;
        j = temp;
        return sort(array, n - 1);
    } else {
        return sort(array, n - 1);
    }
}

谢谢!

编辑:反馈后,这就是我剩下的。测试工作正常,将我的数组打印排序。我发现当看代码太长时间时,我倾向于将我与x [i]混淆。但是,我仍然在避免使用Arrays.toString()或更改为void sort()方面遇到麻烦。如果需要,我会坚持下去。话虽如此,我感谢任何进一步的帮助。

public static void main(String[] args) {
    int array2[] = new int[]{1, 3, 5, 2, 4};
    System.out.println(Arrays.toString(sort(array2, array2.length - 1)));
}

static public int[] sort(int[] array, int lastIndex) {
    int j = lastIndex - 1;
    int temp;
    if (lastIndex == 0) {
        return array;
    } else if (array[lastIndex] < array[j]) {
        temp = array[lastIndex];
        array[lastIndex] = array[j];
        array[j] = temp;
        return sort(array, lastIndex - 1);
    } else if (array[lastIndex] > array[j]) {
        return sort(array, lastIndex - 1);
    }
    return array;
}

2 个答案:

答案 0 :(得分:0)

这是您的答案。我在代码中内嵌了注释。希望对您有所帮助。

    private static int[] sort(int[] array, int lastIndex) {
    if(lastIndex<1) { //If array has only 1 element to be sorted then return array as is.
        return array;
    }
    //move the largest number in the array to the last index of the array;
    for(int i=0;i<array.length-1;i++) {
        if(array[i] > array[i+1]) {
            //swap
            int temp = array[i];
            array[i] = array[i+1];
            array[i+1] = temp;
        }
    }
    // now we know lastIndex element is highest, sort other elements by decrementing lastIndex
    return sort(array, lastIndex-1);
}

答案 1 :(得分:0)

您在这里遇到很多问题。首先,比较索引(i和j是索引,它们告诉您成员在数组中的位置)。您可以通过以下比较值来解决此问题:

else if(array[j] < array[i]){
     temp = array[i];
     array[i] = array[j];
     array[j] = temp;   }

第二,像这样编写,它将只执行一次冒泡排序的迭代,因此您只能确定最小值会出现在数组的开头(如果您知道冒泡排序的工作原理)。要解决此问题,您必须再添加一层递归调用,但是这次您仅调用n-1个数组元素,因为您确定要对最小值进行排序。

另一种无需更改排序方法即可解决此问题的方法是调用for循环并执行sort方法n次。