选择排序 - 交换下一个最小的与最小的整体
Selection sort - Swap with next smallest vs smallest overall
我有一个关于选择排序的问题。在下面的示例中 -
12 8 7 5 2
下一步会是
8 12 7 5 2
或
2 8 7 5 12
?
原因是,从伪代码来看,我们似乎只是简单地寻找first值小于现有first的元素,而不是smallest总体。所以按照这个逻辑,要与 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;
}
我的理解有问题吗? 2 个步骤中哪一个是正确的?代码应该理想地导致第一个选项,不是吗?
谢谢!
在选择排序中,需要找出剩余数组中最小的元素,并将两者交换。
因此在您的示例中,下一步应该是 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;
}
您开始于:
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
所以你的第二个例子是正确的第一步。
它将是2, 8, 7, 5, 12
。选择排序总是把最小的元素带到左边。将选择排序视为冒泡排序的对立面。其中冒泡排序冒泡右边最大的元素,选择排序则相反。希望对您有所帮助。
我有一个关于选择排序的问题。在下面的示例中 -
12 8 7 5 2
下一步会是
8 12 7 5 2
或
2 8 7 5 12
?
原因是,从伪代码来看,我们似乎只是简单地寻找first值小于现有first的元素,而不是smallest总体。所以按照这个逻辑,要与 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;
}
我的理解有问题吗? 2 个步骤中哪一个是正确的?代码应该理想地导致第一个选项,不是吗?
谢谢!
在选择排序中,需要找出剩余数组中最小的元素,并将两者交换。
因此在您的示例中,下一步应该是 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;
}
您开始于:
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
所以你的第二个例子是正确的第一步。
它将是2, 8, 7, 5, 12
。选择排序总是把最小的元素带到左边。将选择排序视为冒泡排序的对立面。其中冒泡排序冒泡右边最大的元素,选择排序则相反。希望对您有所帮助。