for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
| 特性 | 選擇排序 | 冒泡排序 | 題目代碼 |
|---|---|---|---|
| 核心邏輯 | 每輪找最小值索引,輪末**單次交換** | 相鄰比較,**多次交換**冒泡最大值到末尾 | 固定 i,與所有 j>i 比較並**即時交換** |
| 交換次數 | O(n) 最少 | O(n²) 最多 | O(n²) 多次交換 |
| 穩定性 | 不穩定 | 穩定 | 不穩定(相等不交換但長距離交換) |
| 標準寫法 | minIdx=i; for(j) if(arr[j] | for(j) if(arr[j]>arr[j+1]) swap(j,j+1) | 介於兩者之間 |
public static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIdx]) minIdx = j;
}
if (minIdx != i) {
int temp = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = temp;
}
}
}
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break; // 提前結束優化
}
}
題目代碼屬於**簡單交換排序**,正確性無誤但非標準選擇排序。教學/面試場合請使用標準選擇排序(單次交換)或冒泡排序(相鄰比較),並能說出時空複雜度與穩定性差異。