// 冒泡排序:相鄰比較,大數逐步「冒泡」到末尾
for (int i = n-1; i > 0; i--)
for (int j = 0; j < i; j++)
if (a[j+1] < a[j]) swap(a[j], a[j+1]);
// 你的寫法(實為選擇排序):每輪選出最大值放到末尾
for (int i = n-1; i > 0; i--)
for (int j = i-1; j >= 0; j--)
if (a[i] < a[j]) swap(a[i], a[j]);
| 指標 | 冒泡排序 | 選擇排序 |
|---|---|---|
| 比較次數 | ~N²/2 | ~N²/2 |
| 交換次數 | ~N²/4(平均) | ~N(每輪最多 1 次) |
| 穩定性 | 穩定 | 不穩定 |
| 適合場景 | 數據量小、近乎有序 | 寫入開銷大(如 Flash/EEPROM) |
數組 {2,6,4,7,0,1,3,4,5,8,9,0} 中冒泡交換 26 次,選擇交換 21 次。選擇排序**交換次數顯著少於冒泡**,因每輪僅將最終確定的最大值與當前位置交換一次。
std::sort(Introsort,O(N log N))、qsort 或語言內置排序。你寫的其實是**選擇排序**變體,而非冒泡排序,理解兩者差異有助於選擇合適算法。