目录
基本介绍
算法思想:
实例:
⛅思路分析:
总结:
代码实现:
算法性能分析
时间复杂度
空间复杂度
稳定性
选择排序(select sorting)也属于内部排序法,是从待排序的数据中,按指定的规则选出某一元素,再按照规定交换位置后达到排序的目的。
每一次从待排序的数据元素中选出最小(或最大)的一个元素,将元素存放在序列的起始位置(即与待排序列的第一个元素的位置进行交换)。然后再从剩余的未排序元素中寻找最小(或最大)的元素,然后存放在已排序序列的末尾。以此类推,直到将待排序的元素全部排完。
原始数组:[101 , 34 , 119 , 1]
第一趟排序:从4个元素里面找到最小的,与第1个元素进行交换,将最小元素存放在起始位置
排序后为:1,34 , 119 , 101
第二趟排序:从剩下的3个元素里面找到最小的,与待排序列的第1个元素进行交换,将最小元素存放在已经排好序的序列尾部。
排序后为: 1, 34 , 119 , 101
第三趟排序:从剩下的2个元素里面找最小的,与待排序列的第1个元素进行交换
排序后为:1,34 , 101 , 139
- 先假定当前这个数是最小数
- 和后面的每个数进行比较,如果发现有比它更小的数,就重新确定最小数,并得到下标
- 当遍历完数组之后,就会得到本轮最小数及其下标
- 进行交换
public class SelectSort {
public static void main(String[] args) {
int[]arr={101,34,119,1};
selectSort(arr);
}
public static void selectSort(int[]arr) {
//安全监测
if (arr == null || arr.length == 1) {
return;
}
for (int count = 0; count < arr.length - 1; count++) {
int minIndex = count;
int min = arr[count];
for (int i = minIndex + 1; i < arr.length; i++) {
if (min > arr[i]) {//说明假定的最小值并不是最小
min = arr[i];//重置min
minIndex = i;//重置minIndex
}
}
//进行交换,将最小值放在序列前
if (minIndex!=count) {
arr[minIndex] = arr[count];
arr[count] = min;
}
System.out.println("第"+(count+1)+"轮后:" + Arrays.toString(arr));
}
}
运行结果:
最优时间复杂度、最坏时间复杂度、平均时间复杂度都是O(n^2),因为无论你是否完全有序,还是完全逆序,都需要找出后边的最小值进行替换。
相比较冒泡排序,每次比较后,只更新最小值的下标,每轮循环值最多只做一次值交换。时间上得到了很大的提升。但是也是使用了双层循环,时间复杂度和冒泡排序的一样。
空间复杂度为O(1)
选择排序是不稳定的排序算法。
举个例子:
例如数组:[ 5 , 8 , 5 , 2 ,]
使用选择排序算法第一次找到的最小元素是2,与第一个位置的元素5进行交换,那此时第一个5和中间的5顺序就发生了变化,因此不稳定。