选择排序(Selection Sort)原理是从待排序的数据中选取最小或最大的一个元素存放在序列的起始位置,然后在剩余未排序的元素中继续寻找最小或最大的元素放到已排序序列末尾,直至待排序的数据元素个数为0
。
复杂度分析
选择排序的比较次数依次为:n - 1
、n - 2
、...
、1
,等差数列求和:n * (n - 1 + 1) / 2 = n² / 2
,时间复杂度O(n²)
。
选择排序和冒泡排序的时间复杂度一样,但因选择排序实际执行的交换操作很少,最多只有n - 1
次,而冒泡排序最坏情况下要执行n²/2
次交换,因此选择排序性能优于冒泡排序。
Java 代码实现
import java.util.Arrays;
public class SelectionSort {
public static void sort(int[] data) {
for (int i = 0; i < data.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < data.length; j++) {
minIndex = data[minIndex] < data[j] ? minIndex : j;
}
if (minIndex != i) {
int temp = data[i];
data[i] = data[minIndex];
data[minIndex] = temp;
}
System.out.println(Arrays.toString(data));
}
}
public static void main(String[] args) {
int[] data = {34, 24, 93, 1, 32, 98, 18, 39};
sort(data);
}
}
运行结果
[1, 24, 93, 34, 32, 98, 18, 39]
[1, 18, 93, 34, 32, 98, 24, 39]
[1, 18, 24, 34, 32, 98, 93, 39]
[1, 18, 24, 32, 34, 98, 93, 39]
[1, 18, 24, 32, 34, 98, 93, 39]
[1, 18, 24, 32, 34, 39, 93, 98]
[1, 18, 24, 32, 34, 39, 93, 98]