選擇排序:每輪從未排序區間找出最小元素,與區間首位交換。時間複雜度 O(n²),空間 O(1),不穩定排序。
package utils.sort;
public class ChooseSort implements SortStrategy {
@Override
public void sort(Comparable[] obj) {
if (obj == null) {
throw new NullPointerException("The argument can not be null!");
}
for (int i = 0; i < obj.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < obj.length; j++) {
if (obj[minIndex].compareTo(obj[j]) > 0) {
minIndex = j;
}
}
if (minIndex != i) {
Comparable tmp = obj[i];
obj[i] = obj[minIndex];
obj[minIndex] = tmp;
}
}
}
}
package utils.sort;
public interface SortStrategy {
void sort(Comparable[] array);
}
Integer[] arr = {5, 2, 9, 1, 5, 6};
new ChooseSort().sort(arr);
// arr → [1, 2, 5, 5, 6, 9]
String[] names = {"Bob", "Alice", "Charlie"};
new ChooseSort().sort(names);
// names → ["Alice", "Bob", "Charlie"]
compareTo,回傳負/零/正代表小於/等於/大於。tmp,空間複雜度 O(1)。null 陣列直接拋出 NullPointerException。minIndex == i 則略過交換,減少指令數。| 演算法 | 平均時間 | 最壞時間 | 空間 | 穩定 |
|---|---|---|---|---|
| 選擇排序 | O(n²) | O(n²) | O(1) | 否 |
| 插入排序 | O(n²) | O(n²) | O(1) | 是 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 否 |
| 合併排序 | O(n log n) | O(n log n) | O(n) | 是 |
| Arrays.sort() | O(n log n) | O(n log n) | O(log n) | 視實作 |
Arrays.sort() 或 Collections.sort()(TimSort,O(n log n)、穩定、高度優化)。Comparator 而非修改元素類別。