在selectionSorting中出错

时间:2016-05-13 09:50:10

标签: java arrays sorting

我从现场开始,对数组排序有疑问。 我找不到程序没有数组排序的原因 谢谢你的帮助。

代码

package sorting;

public class selectionSort
{
    public static void main (String[]args)
    {
        int []a={2,5,3,1,7,10,12};

        printArray(a);
        insertSort(a);
        printArray(a);
    }

    public static void insertSort(int[]array)
    {   
        for(int i=0;i<array.length-1;i++)
        {
            int smallestIndex=i;
            for(int j=i+1;j<array.length;j++)
            {
                if(array[smallestIndex]>array[j])
                {
                    smallestIndex=j ;
                }
                if(smallestIndex!= i)
                {
                    int temp=array[smallestIndex];
                    array[smallestIndex]=array[i];
                    array[i]=temp;
                }
            }
        }
    }//insertSORT


    public static void printArray(int[] array)
    {
        for(int i=0 ;i<array.length;i++)
        {
            System.out.print(array[i]+" ");
        }
        System.out.println("");
    }

}

3 个答案:

答案 0 :(得分:2)

这种类型的逻辑应该是:

  • 找到数组中的最小数字,并将其放在首位。
  • 找到数组其余部分中的最小数字,并将其放在第二位。
  • 找到数组其余部分中的最小数字,并将其放在第三位。

等等。

这里的问题是你需要找到阵列其余部分的 all 中哪个数字最小,并且只有在你完成最小的扫描之后,你应该用<我>我

元素。

但是你的错误是你在扫描时交换了值。

所以,参加第一轮。

┌───┬───┬───┬───┬───┬────┬────┐
│ 2 │ 5 │ 3 │ 1 │ 7 │ 10 │ 12 │
└───┴───┴───┴───┴───┴────┴────┘
  0   1   2   3   4   5    6

你的元素是2.你扫描并得到j = 3,1。你将smallestIndex设置为3.然后你交换它们,现在你有了

┌───┬───┬───┬───┬───┬────┬────┐
│ 1 │ 5 │ 3 │ 2 │ 7 │ 10 │ 12 │
└───┴───┴───┴───┴───┴────┴────┘
  0   1   2   3   4   5    6

这恰好很好 - 但你还在扫描。您的j现在转到4,指向7.第一个if不正确。你不能改变smallestIndex。但是,当您到达第二个3时,其值仍为if。所以你现在再次交换:

┌───┬───┬───┬───┬───┬────┬────┐
│ 2 │ 5 │ 3 │ 1 │ 7 │ 10 │ 12 │
└───┴───┴───┴───┴───┴────┴────┘
  0   1   2   3   4   5    6

然后再次为j = 5,然后当j = 6时再次返回。你最终在旧地方回来了。

解决方案是将交换移到外部j循环 - 在确定哪个索引是最小索引之后,才交换它们。

public static void insertSort(int[] array) {
    for (int i = 0; i < array.length - 1; i++) {
        int smallestIndex = i;
        for (int j = i + 1; j < array.length; j++) {
            if (array[smallestIndex] > array[j]) {
                smallestIndex = j;
            }
            // Not here!
        }
        // Do the swap outside the j loop.
        if (smallestIndex != i) {
            int temp = array[smallestIndex];
            array[smallestIndex] = array[i];
            array[i] = temp;
        }
    }
}

答案 1 :(得分:0)

插入排序算法有两种方式,我的意思是你希望你的第一个for循环从左到右,第二个从右到左,从你到达的位置开始。 你检查第一个for循环中的下一个数字,如果小于你想要找到它所属位置的前一个数字,并将所有其他数字移到右边。

for(int i = 1; i < A.length; i++){
        if(A[i]<A[i-1]){
            for(int j = i; j > 0; j--){
                do{
                    int x = A[j-1];
                    A[j-1] = A[j];
                    A[j] = x;
                } while (A[j]<A[j-1]);
            }
        }
    }

答案 2 :(得分:0)

首先, SELECTION 排序和 INSERTION 排序是两种不同的算法。您的方法名称具有误导性。

这里有关于其实施的信息: https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Selection_sort https://en.wikipedia.org/wiki/Selection_sort#Implementation https://en.wikipedia.org/wiki/Insertion_sort#Algorithm_for_insertion_sort