插入排序有什么问题?

时间:2014-03-06 10:57:24

标签: java algorithm sorting insertion-sort

我正在尝试使用基于插入的排序算法对大型数据文件进行排序,代码运行正常,但输出不正确。我一遍又一遍地研究它完全无济于事,谁能看到我出错的地方?

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 五 9 6 7 4 8 8

2 个答案:

答案 0 :(得分:5)

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

然后items[j] = temp;也会产生ArrayIndexOutOfBoundsException因为,在循环结束时,items[j]小于tempj == -1,所以我们需要在此之后的位置插入 - 最简单的修复只是将其更改为items[j+1] = temp;

答案 1 :(得分:0)

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)));
    }
}