java中的选择排序不一致

时间:2017-10-26 11:57:06

标签: java arrays sorting selection

我一直在尝试用Java编写一个选择排序程序,并且(通过浏览其他论坛后)认为我的代码是正确的。 Curretnly它是

public class SelectionSort {

    public static int[] selectionSort(int[] numbers) {

        for (int i = 0; i < numbers.length; i++) {
            int currentMin = i;
            for(int k = i+1; k < numbers.length; k++) {
                if (numbers[k] < numbers[currentMin]) {
                    currentMin = k;

                    if(currentMin != i) {
                        int placeholder = numbers[i];
                        numbers[i] = numbers[currentMin];
                        numbers[currentMin] = placeholder;
                    }
                }
            }
        }
        return numbers;
    }

}

当我运行3个样本数组时,其中一些有效,有些则无效。我在下面的数组之前和之后都是:

  

[5,2,7,6,8,1,5]

     

[1,2,5,5,6,7,8](正确的顺序)

     

[5,2,4,0,8,7,6,3,0,7,8,5,4,6,3,0,8,7,7,6,3,9,0]

     

[3,0,3,0,2,3,0,0,4,4,5,5,6,6,6,7,7,7,8,8,8,9] (错误的顺序)

     

[8,5,7,6,2,7,6,1,2,5,4,9]

     

[2,1,5,4,2,6,7,7,5,5,8,9](错误的顺序)

当我转动括号时,他们就是这样:

public class SelectionSort {

public static int[] selectionSort(int[] numbers) {
        for (int i = 0; i < numbers.length; i++) {
            int currentMin = i;
            for(int k = i+1; k < numbers.length; k++) {
                if (numbers[k] < numbers[currentMin]) {
                    currentMin = k;
                    }

                    if(currentMin != i) {
                        int placeholder = numbers[i];
                        numbers[i] = numbers[currentMin];
                        numbers[currentMin] = placeholder;
                    }
                }
            }

        return numbers;
    }

}

我得到了这些结果

  

[5,2,7,6,8,1,5]

     

[5,2,5,1,6,7,8](错误)

     

[5,2,4,0,8,7,6,3,0,7,8,5,4,6,3,0,8,7,7,6,3,9,0]

     

[0,0,0,0,2,3,3,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9] (右)

     

[8,5,7,6,2,7,6,1,2,5,4,9]

     

[1,2,5,5,2,6,6,7,7,8,4,9](错误)

基本上,我如何获得它以便所有数组都以正确的方式排序?我真的不确定错误在哪里,因为将它与其他代码进行比较来做类似的事情,似乎是一致的。 感谢

2 个答案:

答案 0 :(得分:4)

此元素交换:

if(currentMin != i) {
    int placeholder = numbers[i];
    numbers[i] = numbers[currentMin];
    numbers[currentMin] = placeholder;
}

应该在整个内循环之外。

选择排序是在数组的剩余部分(内部循环)中找到最小元素,并使用当前位置中的元素交换此最小值。因此,每次外循环迭代最多只有一次交换。

答案 1 :(得分:0)

您的内部循环正在交换i而不是currentMin

你可以这样修改(也可能不需要if(currentMin != i) {

int placeholder  = numbers[currentMin];  
numbers[currentMin] = numbers[i];
numbers[i] = placeholder;