算法图解
选择
一个最大/小的数, 排到最前面
假设数组长度为 n
- i = 0 , 遍历 [i,n] 个数字,
选择
一个最小的, 和 i 交换 - i + 1
- 重复 1 2 步骤, 直到 i == n
实现
int n = array.length;
int curMin;
for (int i = 0; i < n - 1; i++) {
curMin = i;
for (int j = i + 1; j < n; j++) {
curMin = array[curMin] > array[j] ? j : curMin;
}
doSwap(array, i, curMin);
}
时间复杂度
f(n) = n(n-1)/2 = O(n^2)
空间复杂度
O(1), 没有使用多余的空间
完整代码
class SelectionSort {
private static void sort(int[] array) {
if (array == null || array.length == 1) {
return;
}
int n = array.length;
int curMin;
for (int i = 0; i < n - 1; i++) {
curMin = i;
for (int j = i + 1; j < n; j++) {
curMin = array[curMin] > array[j] ? j : curMin;
}
doSwap(array, i, curMin);
}
}
private static void doSwap(int[] array, int x, int y) {
int t = array[x];
array[x] = array[y];
array[y] = t;
}
public static void main(String[] args) {
int[] array = {111, 522, 77, 98, 36, 12, 13, 48};
sort(array);
System.out.println(arrayToString(array));
}
private static String arrayToString(int[] array) {
StringBuilder builder = new StringBuilder();
for (int t : array) {
builder.append(t + " ");
}
return builder.toString();
}
}