我的插入排序逻辑看似正确,但不起作用

时间:2014-07-06 19:45:17

标签: java sorting insertion-sort

我正在尝试实现插入排序。

public int[] insertionSort(int[] a) {

    for(int i=0; i<a.length;i++) {
        int j=i+1;

        while(a[j] < a[i] && j < a.length) {
            swap(a[j],a[i]);
            j--;
            i--;
        }
    }
    return a;
}

public void swap(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

它是否在技术上是相同的(就输出结果而言),就好像我说j = i-1并用j&lt;中的while循环中的条件代替j? a.length到j> = 0?

1 个答案:

答案 0 :(得分:2)

您不能以这种方式交换其他方法中的值,因为参数传递的是值,而不是对值的引用。

你可能最好不要使用单独的交换方法,比如这样(也必须增加而不是递减ij值):

public int[] insertionSort(int[] a) {
    int temp;

    for(int i=0; i<a.length;i++) {
        int j=i;

        while(j > 0 && a[j-1] > a[j]) {
            temp = a[j];
            a[j] = a[j-1];
            a[j-1] = temp;
            j--;
        }
    }
    return a;
}

编辑:不得不再次更新 - while循环中的条件顺序错误,因此在检查数组的下一个索引是否已到达数组末尾之前会查找该数组的下一个索引

编辑2 :正如评论中所述,我将展示如何编写实际有效的swap方法 - 而不是传递值,您必须传递整个数组并在之后归还。我仍然可能建议以上述方式进行,但仅用于教育目的:

public int[] insertionSort(int[] a) {

    for(int i=0; i<a.length;i++) {
        int j=i;

        while(j > 0 && a[j-1] > a[j]) {
            a = swap(a, j-1, j);
            j--;
        }
    }
    return a;
}


public int[] swap(int[] a, int index1, int index2) {
    int temp = a[index1];
    a[index1] = a[index2];
    a[index2] = temp;
    return a;
}

编辑3 :做了一些愚蠢的事情并且没有给出插入排序。现在全部排序(原谅双关语)。