选择排序的核心思想是从数据元素中选出最值与第一个元素/最后一个进行交换,注意是找到最值后才交换,不是边找边交换,以数组为例
第一次 arr[0] ~a[n-1] 找出最值与a[0]交换
第二次arr[1]~a[n-1] 找出最值与a[1]交换
第三次arr[2]~a[n-1] 找出最值与a[2]交换
…
以此类推
选择排序:
时间复杂度是O(n2)
最好情况O(n2)
最坏情况O(n2)
空间复杂度 O(1)
选择排序不占用额外内存,是不稳定算法。
图解选择排序,红色表示已经确定的数据元素
根据上图我们可以发现,选择排序一共有数组大小-1轮排序,每一轮排序,又是一个循环。我们可以先假定第一个数是最值,然后和后面的每一个数进行比较,如果发现有比当前数更小/大的数,就重新确定最值,当遍历到数组的最后,就可以得到最值,交换即可。
核心代码 从小到大为例
public static void selectSort(int[] arr){
//第一个循环表示排序次数
for (int i = 0; i < arr.length - 1; i++) {
//最小值的索引
int minIndex = i;
//最小值
int min = arr[i];
//第二个循环表示每一次元素的排序
for (int j = i+1; j < arr.length; j++) {
if (min>arr[j]){
//重置最小值
minIndex = j;
min = arr[j];
}
}
//判断最值下标是否有变化,没有变化不需要交换
if (minIndex != i){
//交换
arr[minIndex] = arr[i];
arr[i] = min;
}
}
}