选择排序 - 与下一个最小与最小整体交换

时间:2018-02-05 07:45:55

标签: java algorithm sorting selection-sort

我对选择排序有疑问。在下面的例子中 -

  

12 8 7 5 2

下一步将是

  

8 12 7 5 2

  

2 8 7 5 12

原因在于,从伪代码中,我们似乎只是寻找第一个元素,其值小于现有的第一个而不是最小的整体。所以通过这个逻辑,与12交换的元素应该是8而不是2,对吗?

这是我正在使用的伪代码 -

static int[] selectionSort(int[] input) {
    if (input.length == 0) {
        return null;
    }
    else {
        int pos = -1;
        for (int i=0;i<input.length-1;i++) {
            pos = i;
            for (int j=i+1;j<input.length;j++) {
                if (input[j] < input[pos]) {
                    int temp = input[pos];
                    input[pos] = input[j];
                    input[j] = temp;
                }
            }
        }
    }
    return input;
}

我的理解有问题吗?哪两个步骤是正确的?理想情况下,代码应该是第一个选项,不应该吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

您从:

开始
12 8 7 5 2

您从排序部分中没有元素开始,然后迭代直到找到未排序部分中的最小元素。然后将其与未排序部分中的第一个元素交换。

sorted  |  unsorted
2          8 7 5 12

迭代直到找到最小值,并与未排序部分中的第一个交换:

sorted  |  unsorted
2 5         7 8 12

重复几次(不需要交换,因为元素已按顺序排列):

sorted  |  unsorted
2 5 7       8 12

sorted  |  unsorted
2 5 7 8     12

sorted  
2 5 7 8 12

所以你的第二个例子是正确的第一步。

答案 1 :(得分:1)

在选择排序中,您需要找出剩余数组中的最小元素并交换这两个元素。

因此,在您的示例中,下一步应该是2 8 7 5 12。代码中唯一需要的更改是将交换推迟到结束,因此只交换最小的元素。

static int[] selectionSort(int[] input) {
    if (input.length == 0) {
        return null;
    }
    else {
        int pos = -1;
        for (int i=0;i<input.length-1;i++) {
            pos = i;
            for (int j=i+1;j<input.length;j++) {
                if (input[j] < input[pos]) {
                    pos = j;
                }
            }
            int temp = input[pos];
            input[pos] = input[i];
            input[i] = temp;
        }       
    }
    return input;
}

答案 2 :(得分:1)

它将是2, 8, 7, 5, 12。选择排序总是将最小的元素输出到左侧。将选择排序视为冒泡排序的对立面。如果冒泡排序气泡是右边最大的元素,那么选择排序则相反。我希望有所帮助。