冒泡排序通過相鄰比較交換,將大元素逐步「冒泡」到陣列末尾。基本版無論數據是否有序皆執行完所有輪次。優化關鍵:若某輪無任何交換,說明已有序,立即結束。
void bubble_sort_opt(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int swapped = 0;
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 升序
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
swapped = 1;
}
}
if (!swapped) break; // 本輪無交換,提前結束
}
}
下一輪內層迴圈只需掃描至上輪最後交換位置,因其後必已有序。
void bubble_sort_opt2(int arr[], int n) {
int lastSwap = n - 1;
while (lastSwap > 0) {
int currSwap = 0;
for (int j = 0; j < lastSwap; j++) {
if (arr[j] > arr[j+1]) {
int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp;
currSwap = j;
}
}
lastSwap = currSwap;
}
}
qsort/快速排序/歸併排序。