【问题标题】:Broken insertion sort中断插入排序
【发布时间】:2014-02-13 22:45:59
【问题描述】:

我已经调试这段代码一段时间了,但我根本不知道为什么它不起作用。这是在 Java 中实现顺序插入排序的尝试。

public void resultSort(int[] resultSet){
    int j;
    for(int i = 0; i < resultSet.length; i++){
        j = i;
        while(j > 0 && resultSet[j-1] < resultSet[j]){
            swap(j, j-1);
            j = j-1;
        }
    }
}

public void swap(int index1, int index2){
    int sw = numbers[index1];
    numbers[index1] = numbers[index2];
    numbers[index2] = sw;
}

如果有人能指出这里的错误,我会很高兴。提前致谢!

【问题讨论】:

  • 谁是numbers,谁是resultSet
  • @webuster numbers 是在类范围内声明的 n 长度 int 数组。 resultSet 是一个较短的 int 数组(resultSort 方法的参数)。
  • 您的代码对我来说可以正常工作。您是否将numbers[] 传递到您的函数中?
  • resultSet 末尾的连续相同数字将立即中止内部循环。这是您不期望的行为吗?所以像5 1 1 这样的数组永远不会正确排序。但它看起来(未经测试)就像其他一切都很好。 (编辑..实际上应该可以,因为之前的迭代应该导致1 5 1,这将正确排序)
  • @HenrikHillestadLøvold 好吧,您可能应该保持一些一致性并将resultSet 传递给您的swap 函数,以便您的交换实际上发生在同一个数组中。

标签: java algorithm insertion-sort


【解决方案1】:

您似乎对numbersresultSet 有疑问。如果您将 numbers 数组作为参数传递给排序函数,它可以工作。

一些建议:

  • 将您的 resultSet 作为参数传递给您的 swap 函数,以保持您实际排序的数组的一致性
  • 避免将类范围的数组用于此类操作(这个是有争议的,取决于您的实际任务)

【讨论】:

    【解决方案2】:

    如果您致电resultSort(numbers),它会起作用。您的算法按降序排序。这是我的测试代码,我做了一些小改动以使其全部变为静态。我想问题是,resultSort 不是用参数 numbers 调用的。

        static int numbers[] = new int[]{34, 24, 56, 12, 45, 2, 53, 758};
    
        public static void main(String[] args) {
            resultSort(numbers);
            for (int i : numbers) {
                System.out.println(i + " ");
            }
        }
    
        public static void resultSort(int[] resultSet) {
            int j;
            for (int i = 0; i < resultSet.length; i++) {
                j = i;
                while (j > 0 && resultSet[j - 1] < resultSet[j]) {
                    swap(j, j - 1);
                    j = j - 1;
                }
            }
        }
    
        public static void swap(int index1, int index2) {
            int sw = numbers[index1];
            numbers[index1] = numbers[index2];
            numbers[index2] = sw;
        }
    

    【讨论】:

    • 是的,我也复制了这样的代码,它可以工作!!!所以作者应该提供一个数组,在这种情况下它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多