插入在java中排序,并且很难解释一些奇怪的行为

时间:2017-08-29 14:13:05

标签: java algorithm insertion-sort

我在java中编写了一个Insertion Sort的实现,并且很难解释一些奇怪的行为。

这是我的代码:

package algorithm.insertionsort;

public class InsertionSort {

    public static void main(String[] args) {
        int[] array = new int[]{10, 9, 8, 7, 6, 5, 4, 3, 202, 1, 400, 0, 12};
        int[] sortedArray = insertionSort(array);

        for (int element : sortedArray) {
            System.out.print("" + element + " ");
        }

    }

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

这是输出:

0 1 3 4 5 6 7 8 9 10 202 400 12 

为什么排序中排除了最终元素?

2 个答案:

答案 0 :(得分:3)

你的循环中有一个小错字:

for (int i = 1; i < a.length - 1; i++) {应该成为......

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

当以这种方式修复时,你将迭代整个数组(除了第一个元素),而不是索引1处的元素和倒数第二个元素(其中12,最后一个元素)之间的范围,被遗漏了)。

输出(已修复)

0 1 3 4 5 6 7 8 9 10 12 202 400 

答案 1 :(得分:3)

因为您从index = 1index < length - 1的循环被排除在外:

{10, 9, 8, 7, 6, 5, 4, 3, 202, 1 , 400, 0, 12}
     ^__________________________________^

相反,您必须从index = 1循环到index < length

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

现在迭代的范围是:

{10, 9, 8, 7, 6, 5, 4, 3, 202, 1 , 400, 0, 12}
     ^______________________________________^