如何让我的数组正确排序?递归排序

时间:2015-04-08 20:19:07

标签: java arrays sorting recursion

经过多次试图解决这个问题,我似乎无法解决我的困境。在尝试运行我的程序时,未打开的数组在打印时不会排序" Sorted Array"。有什么东西我做错了吗?

public class RecursiveSorter {

    private int[] sortedArray;
    private int[] array;

    public RecursiveSorter() {
        array = new int[1];
    }

public RecursiveSorter(int[] a) {
    array = a;
}

public void setArray(int[] a) {
    array = a;
}

public int[] getSortedArray() {
    return sortedArray;
}

public int[] getOriginalArray() {
    return array;
}

public int[] sort() {
    sortedArray = array;
    recursiveSort(sortedArray.length - 1);
    return sortedArray;
}

public int[] recursiveSort(int endIndex) {
    if (endIndex > 0) {
        int m = getMaxIndex(endIndex, sortedArray);
        swap(m, endIndex, sortedArray);
        recursiveSort(endIndex-1);
    }
    return sortedArray;
}

public int getMaxIndex(int endIndex, int[] a) {
    int max = a[0];
    int maxIndex = 0;
    for (int i = 1; i < endIndex; i++) {
        if (a[i] < max) {
            max = a[i];
            maxIndex = i;
        }
    }
    return maxIndex;
}
//Changed it to make sure that it is swapping the elements correctly
public void swap(int src, int dest, int[] a) {
    if(dest <= src)
    {
    int temp = a[dest];
    a[dest] = a[src];
    a[src] = temp;

     dest++;
     src++;
    }
}

public String toString() {
    return "Original: " + prettyPrint(getOriginalArray()) + "\n" +
           "Sorted:   " + prettyPrint(getSortedArray());
}

private String prettyPrint(int[] a) {
    String s = "";
    for (int i : a)
        s += i + " ";
    return s;
}

public static void main(String[] args) {
    // Automate running, but not testing
    int[] array = {5, 67, 12, 20};
    RecursiveSorter s = new RecursiveSorter(array);
    s.sort();
    System.out.println(s); // uses Sorter.toString
}

}

3 个答案:

答案 0 :(得分:2)

你有3个问题。 2在getMaxIndex()中:您没有在测试中包含max的最后一个元素,而max的测试不是正确的。您正在计算 min

public int getMaxIndex(int endIndex, int[] a) {
    int max = a[0];
    int maxIndex = 0;
    for (int i = 1; i <= endIndex; i++) {   // use <= instead of <
        if (a[i] > max) {                   // change < in >
            max = a[i];
            maxIndex = i;
        }
    }
    return maxIndex;
}

swap()

中的一个问题
public void swap(int src, int dest, int[] a) {
    if(src <= dest)      // reverse src and dest
    {
        int temp = a[dest];
        a[dest] = a[src];
        a[src] = temp;

        dest++; // no use, dest is local
        src++; // idem
    }
}

然后你会:

原文:5 12 20 67 排序:5 12 20 67

实际上修改了原始数组,因为arraysortedArray引用了int相同数组。 Java中没有副本。当你这样做

public int[] sort() {
    sortedArray = array;
    recursiveSort(sortedArray.length - 1);
    return sortedArray;
}

sortedArray 指向int[]相同的array。如果你想保留原始的一个,你需要明确地做一个副本,例如System.arrayCopy(...)

答案 1 :(得分:1)

我将问题追溯到两点:

首先,if中有一个不必要的swap(...)

public void swap(int src, int dest, int[] a)
{
    // if(dest <= src)
    // {
        int temp = a[dest];
        a[dest] = a[src];
        a[src] = temp;

    //     dest++;
    //     src++;
    // }
}

其次,for的{​​{1}}循环中有一个小错误:

getMaxIndex(...)

通过这些更改(并提及System.arraycopy),算法应按预期工作。

答案 2 :(得分:-2)

你为什么不唱歌

// sorting array in #java.util.Arrays;
Arrays.sort(array);

并且不需要重复呼叫和所有

如果你需要编写自己的代码,那么选择任何排序algorthim,自己实现。

private static void sort(int[] array){
 boolean swapped = true;
int j = 0;
int tmp;
while (swapped) {
    swapped = false;
    j++;
    for (int i = 0; i < array.length - j; i++) {
        if (array[i] > array[i + 1]) {
            tmp = array[i];
            array[i] = array[i + 1];
            array[i + 1] = tmp;
            swapped = true;
        }
    }
}

}