两者区别:
-
直接选择排序是对元素直接排序 而 选择排序先获取到元素的最大值或最小值下标再进行交换
解释:直接选择排序每次遇到n-1>n 的时候就要发生交换;简单选择排序则只是记录下较大那个元素的位置,这样一轮过后这个记录变身本轮所要选取的最大值,而每轮需要确定的位置已由外层循环确定,只需将最大元素位置记录所对应的元素与要确定的位置交换机可。
话不多说直接上代码演示
-
直接选择排序
int[] arr = {19, 4, 54, 7, 15, 12};
for (int i = 0; i < arr.length-1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
System.out.println("第" + (i + 1) + "轮:" + Arrays.toString(arr));
}
// 打印结果
// 第1轮:[54, 4, 19, 7, 15, 12]
// 第2轮:[54, 19, 4, 7, 15, 12]
// 第3轮:[54, 19, 15, 4, 7, 12]
// 第4轮:[54, 19, 15, 12, 4, 7]
// 第5轮:[54, 19, 15, 12, 7, 4]
-
简单选择排序
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] < arr[j]) {
min = j;
}
}
if (min != i){
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
System.out.println("第" + (i + 1) + "轮:" + Arrays.toString(arr));
}
// 打印结果
// 第1轮:[54, 4, 19, 7, 15, 12]
// 第2轮:[54, 19, 4, 7, 15, 12]
// 第3轮:[54, 19, 15, 4, 7, 12]
// 第4轮:[54, 19, 15, 12, 4, 7]
// 第5轮:[54, 19, 15, 12, 7, 4]
可以看到两者每一轮的打印结果完全相同
因此
-
我们不会说“这是两个不同的算法”,因为它们的本质是相同的。
你会发现简单选择排序“多加了一个变量”
其实有一点需要澄清:
- 算法没有规定变量要开多少个。“多加了一个变量”是针对某一种实现而言。
算法只规定了开变量的“规模”。譬如,开n个变量,空间复杂度是 O(n) ;开2n+100个变量,空间复杂度也是 O(n)。两种排序方式,只是“选择排序”这一算法的两种不同实现而已。