如何纠正我的选择和插入排序算法

时间:2015-03-22 20:12:28

标签: java sorting insertion-sort selection-sort

我写了选择和插入排序算法,它给了我错误的未排序输出。这是我的选择代码:

public class SelectionSort {

    public static void main(String[] args) {

        int[] arr = {23,43,45,3,54,55,23,12,22};

        int min;
        int temp = 0;

        for(int i = 0; i < arr.length-1; i++)
        {
            min = i;
            for(int j = i+1; j<arr.length; j++)
            {
                if(arr[j] < arr[min])
                {
                    min = j;

                }
                temp = arr[j];
                arr[j] = arr[min];
                arr[min] = temp;
            }

        }

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


    }

}
  

产出:45 55 54 43 23 23 22 12 3

这没有排序,我希望它按升序排序。

这是我的插入排序:

public class Insertion {

    public static void main(String[] args) {

        int[] arr = {2,4,6,5,4,3,5,3};

        for(int i = 1; i < arr.length; i++)
        {
            int temp = arr[i];

            int j = i;

            while( j > 0 && arr[j-1] > arr[j])
            {
                arr[j] = arr[j-1];
                j = j-1;
            }
            arr[j] = temp;
        }

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

    }
}
  

输出:2 4 5 4 3 5 3 6

1 个答案:

答案 0 :(得分:1)

在您的选择排序中,让我们关注代码的这一部分:

    for(int i = 0; i < arr.length-1; i++)
    {
        min = i;
        for(int j = i+1; j<arr.length; j++)
        {
            if(arr[j] < arr[min])
            {
                min = j;

            }
            temp = arr[j];   // <---
            arr[j] = arr[min];
            arr[min] = temp;
        }
    }

选择排序背后的高级思想是找到范围[i,n)中的最小元素,然后将其与位置i处的元素交换。请注意,使用此处的代码,您不断地使用min的索引交换当前索引,而不是您要进行的交换。作为提示,在外循环的每次迭代中最多进行一次交换,并使该交换位于位置i和位置min之间。如果你早于此交换,你将得到错误的答案。

对于您的插入排序,有一个更微妙的错误。这是错误的地方:

while( j > 0 && arr[j-1] > arr[j])
{
    arr[j] = arr[j-1];
    j = j-1;
}
arr[j] = temp;

请注意,只要当前元素的比较小于它之前的元素,就会用当前元素覆盖当前元素,然后递减j。但是,您不会使用当前元素更新arr[j-1],因此在下一次比较中,您将以前位于j-1的元素与位置{{1}中的元素进行比较而不是将当前元素与位置j-2中的元素进行比较。要解决此问题,请将比较更新为始终与j-2进行比较,而不是temp

arr[j]