【问题标题】:What's wrong with my insertion sort?我的插入排序有什么问题?
【发布时间】:2014-03-06 10:57:24
【问题描述】:

我正在尝试使用基于插入的排序算法对大型数据文件进行排序,代码运行良好,但输出不正确。我一遍又一遍地研究它完全没有用,有人能看出我哪里出错了吗?

public void sort(Comparable[] items) {
    for (int i = 1; i < items.length; i++) {
        Comparable temp = items[i];
        int j = i - 1;
        while (j >= 0 && items[j].compareTo(items[j]) > 0) {
            items[j + 1] = items[j];
            j = j - 1;
        }
        items[j] = temp;
    }
}

我制作的一个示例数据文件是...

2
1
3
5
9
6
7
4
8

显然输出应该是 1,2,3,4... - 但我得到的是 1 3 5 9 6 7 4 8 8

【问题讨论】:

  • 您能展示一个您尝试排序的示例测试用例吗?
  • 不应该是items[j + 1] = temp吗?
  • 和预期/实际输出..
  • 你为什么要自己实现排序?它是锻炼的一部分吗?还是您真的只需要对数据文件进行排序?如果是这样,请考虑 Sort 的标准实现
  • 这是卢卡斯的一部分。

标签: java algorithm sorting insertion-sort


【解决方案1】:

items[j].compareTo(items[j]) 应该是 items[j].compareTo(temp),否则您只是将项目与自身进行比较 - 您需要将其与要插入的对象进行比较。

那么items[j] = temp;也会导致ArrayIndexOutOfBoundsException,因为在循环结束时,items[j]小于tempj == -1,所以我们需要在后面的位置插入-最简单的解决方法是将其更改为 items[j+1] = temp;

【讨论】:

  • 您好 Dukeling,感谢您的帮助。输出仍然不正确。它现在输出...2 1 3 5 9 6 7 4 8。
  • 谢谢你,我现在明白了。
【解决方案2】:

Algorithm:

for i ← 1 to length(A)
    j ← i
    while j > 0 and A[j-1] > A[j]
        swap A[j] and A[j-1]
        j ← j - 1

翻译成 Java:

import java.util.*;

class InsertionSortTest {
    public static int[] insertionSort(int[] A) {
        for (int i = 1; i < A.length; i++) {
            int j = i;
            while (j > 0 && A[j-1] > A[j]) {
                int t = A[j];
                A[j] = A[j-1];
                A[j-1] = t;
                j--;
            }
        }
        return A;
    }

    public static void main (String[] args) {
        int[] arr = { 5, 3, 0, 2, 1, 4 };

        System.out.println(Arrays.toString(insertionSort(arr)));
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多