我对选择排序有疑问。在下面的例子中 -
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;
}
我的理解有问题吗?哪两个步骤是正确的?理想情况下,代码应该是第一个选项,不应该吗?
谢谢!
答案 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
。选择排序总是将最小的元素输出到左侧。将选择排序视为冒泡排序的对立面。如果冒泡排序气泡是右边最大的元素,那么选择排序则相反。我希望有所帮助。