插入排序错误

时间:2013-09-14 18:44:47

标签: java sorting insertion-sort

我的insertSort程序没有显示正确的结果:'(

Arry是:5 2 6 1 3

结果将:1 2 3 5 6

但不显示结果。

代码是:

public class insertionSort
{
    public static void main(String[] args)
    {
        int data[] ={5,2,6,1,3};
        for(int j = 2; j <data.length; j++)
        {
            int key = data[j];
            int i = j - 1;
            while(i > 0 && data[i] > key)
            {
                data[i + 1] = data[i];
                i=i-1;
            }

            data[i + 1] = key;
            System.out.print(data[j]+" ");


        }
    }
}

4 个答案:

答案 0 :(得分:1)

试试这个

 public class insertionSort
{
public static void main(String[] args)
{
    int data[] ={5,2,6,1,3};
    for(int j = 1; j <data.length; j++)
    {
        int key = data[j];
        int i = j - 1;
        while(i >= 0 && data[i] > key)
        {
            data[i + 1] = data[i];
            i=i-1;
        }

        data[i + 1] = key;


       System.out.print(data[j]+" ");
    }

}
}

答案 1 :(得分:0)

试试这样:

使用 for-loop 开始主j = 1,并在while循环 i>=0

中创建条件
import java.util.Arrays;

public class insertionSort {
    public static void main(String[] args) {
        int data[] = { 5, 2, 6, 1, 3 };
        for (int j = 1; j < data.length; j++) {
            int key = data[j];
            int i = j - 1;
            while (i >= 0 && data[i] > key) {
                data[i + 1] = data[i];
                i = i - 1;
            }

            data[i + 1] = key;

        }
        System.out.println(Arrays.toString(data));
        // It prints [1, 2, 3, 5, 6]
    }
}

答案 2 :(得分:0)

您可以为此问题创建单独的课程 而且这个目标确实在这个课程上。

喜欢这个:

public class InsertionSorter {
    private int[] a;

    /**
     * Constructs an insertion sorter.
     * @param anArray the array to sort
     */
    public InsertionSorter(int[] anArray) {
        a = anArray;
    }

    /**
     * Sorts the array managed by this insertion sorter
     */
    public void sort() {
        for (int i = 1; i < a.length; i++) {
            int next = a[i];

            // Move all larger elements up
            int j = i;
            while (j > 0 && a[j - 1] > next) {
                a[j] = a[j - 1];
                j--;
            }

            // Insert the element
            a[j] = next;
        }
    }
}

或者只对现有类使用带有数组参数的静态方法。

答案 3 :(得分:0)

除此之外,看起来这里的主要问题是你正在尝试打印数组的元素你正在对它进行排序。让我们看一下循环的几次迭代,看看发生了什么:

j = 2; data = { 5, 2, 6, 1, 3 }
    key = data[2] = 6
    i = j - 1 ==> i = 2 - 1 = 1
    data[i] = 2 < key = 6 <-- while loop does nothing
    data[i+1] = data[2] = key = 6
    data[j] = 6

j = 3; data = { 5, 2, 6, 1, 3 }
    key = data[2] = 1
    i = j - 1 ==> i = 3 - 1 = 2
    data[i] = 6 > key = 1
        data[3] = data[2] ==> data[3] = 6
        i = i - 1 ==> i = 1
    data[i] = 2 > key = 1
        data[2] = data[1] ==> data[2] = 2
        i = i - 1 ==> i = 0
    i <= 0 <-- while loop stops
    data[i+1] = data[0] = key = 1
    data[j] = 6

data = { 5, 1, 2, 6, 3 }

在英语中发生的事情是插入排序是将最大元素(6)保持在循环索引j,因为这就是插入排序的工作原理。所以每次循环迭代你只需打印出列表的当前最大元素,在这种情况下总是为6.你也可以在错误的索引处开始你的外循环(你应该从1开始,而不是2,为什么你从2开始?)。你也不要让你的内循环看到数组的第一个元素。

所以你的代码应该更像这样:

public class insertionSort
{
    public static void main( String[] args )
    {
        int data[] = { 5, 2, 6, 1, 3 };
        for( int j = 1; j < data.length; ++j )
        {
            int key = data[j];
            int i = j - 1;
            while( i >= 0 && data[i] > key )
            {
                data[i + 1] = data[i];
                --i;
            }

            data[i + 1] = key;
        }

        for( int k = 0; k < data.length; ++k )
        {
            System.out.print( data[k] + " " );
        }
    }
}