Select Sort
时间复杂度O(n**2)
最好情况O(n**2) // 已经排好序的数字
最坏情况O(n**2) //倒序数组
空间复杂度O(1) // in-place
选择排序
每次选择最大/最小的数放在应该出现的位置
Python:
def Classical_select_sort(num_list):
n = len(num_list)
for i in range(n):
min = i
for j in range(i+1,n):
if num_list[j]<num_list[min]:
min = j
num_list[min],num_list[i] = num_list[i],num_list[min]
return num_list
Java:
public int[] ClassicalSelectSort(int[] a){
for(int i = 0;i<a.length;i++){
int min = i;
for(int j = i+1;j<a.length;j++){
if (a[j]<a[min]){
min = j;
}
}
int tem = a[i];
a[i] = a[min];
a[min] = tem;
}
return a;
}
二元选择排序
在普通选择排序基础上,每次迭代选择最大值和最小值放在应该出现的位置上,减少迭代次数
但是需要注意的是,由于最大值可能在初始最小值的位置上,最小值可能在初始最大值的位置上上,当进行第二次交换时,很可能原本应该交换的值已经再第一次交换时改变,假设我们第二次将最大值放在它应该出现的位置上,在交换前应该判断max是否等于初始值i,若是,说明在第一次i已经被交换到min的位置,这时候我们将min赋值给max即可。
Python:
def Binary_select_sort(num_list):
n = len(num_list)
for i in range(n):
min = i
max = n-1
for j in range(i,n):
if num_list[j]<num_list[min]:
min = j
if num_list[j] > num_list[max]:
max = j
num_list[min], num_list[i] = num_list[i], num_list[min]
if(max == i):max = min
num_list[max], num_list[n-1] = num_list[n-1], num_list[max]
n = n-1
return num_list
Java:
public int[] BinarySelectSort(int[] a){
// find the max and min num in an iteration
int n = a.length;
for(int i = 0;i<n;i++){
int min = i;
int max = n-1;
for(int j = i;j<n;j++){
if (a[j]<a[min]){
min = j;
}
if (a[j]>a[max]){
max = j;
}
}
int tem = a[i];
a[i] = a[min];
a[min] = tem;
// 防止最大的第一个数被换走
if (max == i){
max = min;
}
int tem2 = a[n-1];
a[n-1] = a[max];
a[max] = tem2;
n = n-1;
}
return a;
}
一般来说选择排序不需要优化,或者说优化方式很少。