初學者撰寫冒泡排序時,最常見的錯誤是內層迴圈起始值設定不正確,導致排序結果錯誤或效能低落。
// 錯誤:每次都從頭比較,重複比較已排序元素
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1; j++) { // 錯誤:j 從 0 開始
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
// 標準冒泡排序:每輪將最大值「冒泡」到末尾
void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) { // 趟數
for (int j = 0; j < n - 1 - i; j++) { // 關鍵:n-1-i 避免重複比較
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void optimizedBubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
boolean swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
swapped = true;
}
}
if (!swapped) break; // 本輪無交換,代表已有序
}
}
原回答提供的程式碼實際上是選擇排序而非冒泡排序:
// 選擇排序:每輪選出最小值放到前面
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++) { // j 從 i+1 開始
if (arr[j] < arr[minIdx]) minIdx = j;
}
swap(arr, i, minIdx);
}
}
| 特性 | 冒泡排序 | 選擇排序 |
|---|---|---|
| 核心邏輯 | 相鄰比較交換,大值後移 | 選出最小值,換到前面 |
| 交換次數 | 多 (O(n²)) | 少 (O(n)) |
| 穩定性 | 穩定 | 不穩定 |
| 內層迴圈 | j < n-1-i | j = i+1 到 n-1 |
[3, 1, 2] 手動追蹤索引變化i < n-1、j < n-1-i掌握排序演算法的迴圈邊界條件,是演算法入門的關鍵基礎。