选择排序
程序员文章站
2022-03-01 15:12:02
...
算法思想
找到数组中第i小的元素并将该元素与当前i位置上的元素进行交换
Java实现
import java.util.Arrays;
public class Selection {
/* 选择排序,升序 */
public static void sort(Comparable[] a) {
for (int i = 0, len = a.length; i < len; i++) {
// 寻找第i小元素的下标
int min = i;
for (int j = i + 1; j < len; j++) {
if (a[j].compareTo(a[min]) < 0) {
min = j;
}
}
// 把第i小的元素放在数组下标为i的位置
// 交换元素的代码写在内层循环之外
exchange(a, i, min);
}
}
/* 交换指定下标元素的位置 */
private static void exchange(Comparable[] a, int i, int j) {
Comparable tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
/* 测试 */
public static void main(String[] args) {
Integer[] a = new Integer[] { 9, 2, 3, 4, 1, 1, 7, 3, 4, 16, 22, 10 };
System.out.println(Arrays.toString(a));
Selection.sort(a);
System.out.println(Arrays.toString(a));
System.out.println("end");
}
}
算法分析
时间复杂度: O(n^2)
稳定性: 不稳定, 交换操作会破坏相对顺序
交换次数: N 每次找到第i小的元素就要进行一次交换
比较次数: (N-1)+(N-2)+…+2+1~N^2/2
特点
-
运行时间与输入无关: 扫描一遍数组不能为下次扫描提供信息, 不善于利用输入的相对有序性
-
数据的移动次数是最少的: 交换次数与数组的大小是线性关系
原地操作几乎是选择排序的唯一优点,当空间复杂度要求较高时,可以考虑选择排序;实际适用的场合非常罕见。
参考资料
算法第4版
下一篇: 浅谈ES6基础——Promise