#include
#include
#define N 10
int main(void) {
int a[N], i, j, t;
printf("隨機產生 10 個 100 以內的數:\n");
for (i = 0; i < N; i++) {
a[i] = rand() % 100;
printf("%d ", a[i]);
}
printf("\n");
for (j = 1; j <= N-1; j++) { /* 趟數 */
for (i = 0; i <= N-1-j; i++) { /* 比較次數遞減 */
if (a[i] > a[i+1]) {
t = a[i]; a[i] = a[i+1]; a[i+1] = t;
}
}
}
printf("排序後:\n");
for (i = 0; i < N; i++) printf("%d ", a[i]);
return 0;
}

for (j = 1; j <= N-1; j++) {
int swapped = 0;
for (i = 0; i <= N-1-j; i++) {
if (a[i] > a[i+1]) {
t = a[i]; a[i] = a[i+1]; a[i+1] = t;
swapped = 1;
}
}
if (!swapped) break; /* 本趟無交換,已有序 */
}
雙向交替掃描,將最小元素「沉」至前端,最大元素「浮」至後端,減少龜兔速度差異。
下一趟只需掃描至上一趟最後交換位置,因其後必已有序。
| 指標 | 數值 |
|---|---|
| 時間複雜度(最好) | O(n) —— 已有序配合旗標 |
| 時間複雜度(最壞/平均) | O(n²) |
| 空間複雜度 | O(1) |
| 穩定性 | 穩定 |