一、 算法思路
首先找到数组最小的元素,将它和数组的第一个元素交换位置。然后在数组剩下的元素当中找到最小的元素,将它和数组的第二个元素交换位置…以此类推,直到整个数组排完序。
二、时间复杂度
对于长度为
n
n
n的数组,选择排序需要大约
n
2
n^2
n2次比较和
n
n
n次交换,所以时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
以一组长度为6的整型数组为例,如下图所示:
其中
i
i
i表示交换的次数,共6次。
m
i
n
min
min表示每次循环中数组余下元素当中的最小元素。第一次循环经过了
n
−
1
n-1
n−1次比较,第二次循环经过了
n
−
2
n-2
n−2次比较…共需要
(
n
−
1
)
+
(
n
−
2
)
+
.
.
.
+
1
(n-1)+(n-2)+...+1
(n−1)+(n−2)+...+1次比较,即
n
(
n
−
1
)
/
2
n(n-1)/2
n(n−1)/2次比较,约等于
n
2
n^2
n2。
三、Java实现
public class Selection {
public static void sort(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++) {
if (less(a[j], a[min])) {
min = j;
}
}
exch(a, i, min);
}
}
public static boolean less(Comparable a, Comparable b) {
return a.compareTo(b) < 0;
}
public static void exch(Comparable[] a, int i, int j) {
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}