原理:
1.第一次从数组里选择最大或者最小的元素放在第一位。
2.剩余的元素中再找到最大或者最小的元素依次放在已排序的元素后面。
图解:
选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。
代码实现:
代码git地址
https://github.com/baochunhai/data-structure-algorithms.git
public class SelectSort {
public static void main(String[] args) {
int[] arr = {2, 4, 3, 5, 1, 7};
selectSort(arr);
SortUtil.printArr(arr);
}
private static void selectSort(int[] arr) {
int max = 0;
for (int i = 0; i < arr.length; i++) {
// arr.length-i 表示剩余未选择出的数量
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
max = j;
}
}
SortUtil.swap(arr, i, max);
}
}
}
public class SortUtil {
public static void swap(int[] arr,int a,int b){
int temp = arr[a];
arr[a]= arr[b];
arr[b] = temp;
}
public static void printArr(int[] arr){
for (int i = 0; i < arr.length ; i++) {
System.out.print(arr[i]+"\t");
}
}
}
时间复杂度分析:
经过0.5n²+0.5n次循环完成排序,忽略常数项和低次项,时间复杂度为O(n²)
额外申请的变量仅max,因此空间复杂度为O(1)
最好情况:
整体有序,交换操作执行0次
最坏情况:
整体逆序,交换操作执行n-1次
最好和最坏都会比较n*(n-1)/2次,时间复杂度O(n)
稳定性:
不稳定。如果待排序数组为 23271,选择排序,第一次交换第一个2和7交换位置,排序结果为73221,初始在前的2被交换到后面,说明不稳定。