冒泡排序與選擇排序是入門必學的兩種基礎排序,雖然實務中較少直接使用,但理解其機制有助於掌握排序核心思想。本文以程式碼與輪次輸出對比兩者差異。
public static void bubbleSort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
printArray(nums); // 觀察每輪結果
}
}
特點:相鄰比較、相鄰交換,每輪將當前最大值「冒泡」至未排序區末尾。
public static void selectionSort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) { // 注意:標準寫法 j=i+1
if (nums[i] > nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
printArray(nums);
}
}
特點:每輪只與基準位 i 比較交換,將最小值「選」到已排序區末尾。
| 輪次 | 冒泡排序過程 | 選擇排序過程 |
|---|---|---|
| 1 | 4,3,2,1,5 | 1,4,3,2,5 |
| 2 | 3,2,1,4,5 | 1,2,3,4,5 |
| 3 | 2,1,3,4,5 | 1,2,3,4,5 |
| 4 | 1,2,3,4,5 | 1,2,3,4,5 |
| 5 | 1,2,3,4,5 | 1,2,3,4,5 |
| 維度 | 冒泡排序 | 選擇排序 |
|---|---|---|
| 比較方式 | 相鄰元素兩兩比較 | 基準元素與未排區逐個比較 |
| 交換次數 | 多(每次比較可能交換) | 少(每輪最多一次交換) |
| 穩定性 | 穩定 | 不穩定(交換可能改變相同元素相對序) |
| 時間複雜度 | O(n²) | O(n²) |
| 適用場景 | 教學、近乎有序資料 | 交換成本高、小規模資料 |
boolean swapped 標誌,若某輪無交換提前結束(最好 O(n))。j = i+1,原文 j=0 會導致多餘比較。