notice:
- 为了方便语言形容,本文章默认是从小到大排序。
- 原创,同步于我的个人博客:https://ca11m3g00d.top/
算法思路
选择排序算法思路非常简单,选择排序算法把数组分为有序部分和无序部分,一开始整个数组都是无序的,每次选择操作将会选择无序数组的最小元素并放在无序数组的起始位置作为有序的元素,每次选择之后数组开头的有序元素就会多一个,等整个数组都是有序元素时,排序结束。
算法伪代码
接受排序数组 arr[n]
令i从0循环到n-1,对于每次循环:
找到arr[i]到arr[n-1]最小值的索引minIndex
交换arr[i]和arr[minIndex]
令i=i+1,若可以则继续循环
java实现
class SelectionSorter {
public int[] arr; //要排序的数组
public void loadDefaultTestSample(){ //加载默认的测试样例
arr=new int[]{1,10,2,9,3,8,4,7,5,6,1};
}
public void setArray(int[] input) { //根据已知数组来创建对象
arr = input.clone();
}
public boolean sortBySelectionSort() { //选择排序的主体
if (arr == null) {
return false;
}
for (int i = 0; i < arr.length; i++) {
int minIndex=i; //用于记录最小元素索引
for (int j = i; j < arr.length; j++) {
//minIndex替换规则开始
if (arr[j]<arr[minIndex]) {
minIndex=j;
}
//minIndex替换规则结束
}
//把最小元素交换到无序数组的第一个
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
}
return true;
}
public void printArray(){ //输出当前的数组
System.out.println(Arrays.toString(arr));
}
}
算法特性
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
- 稳定性:稳定性取决于写法
选择排序的稳定性分析
选择排序的稳定性取决于minIndex的替换规则,比如如下两种写法将带来不同的结果:
//第一种写法
if(arr[j]<arr[minIndex]){
minIndex=j;
}
//第二种写法
if(arr[j]<=arr[minIndex]){
minIndex=j;
}
- 第一种写法是稳定的,对于相同的元素选取第一个
- 第二种写法是不稳定的,对于相同的元素会选取最后一个