一、什麼是排序的穩定性

穩定性定義: 對於待排序序列中,若存在兩個相等的元素 A 和 B,並且 A 在 B 之前,那麼排序後 A 仍然排在 B 前面 ——則該排序算法是 穩定的。
反之,如果可能出現相等元素的相對位置改變,就叫“不穩定排序”。

二、如何判斷穩定性(通用方法)

判斷思路非常簡單:

“當兩個相等的元素在排序過程中有可能交換(或跨過彼此)時,它就是不穩定的。”

換句話説:

  • 只要算法會跨區間交換非相鄰元素,就可能破壞穩定性。
  • 如果算法只比較並交換相鄰元素(並保持相等時不交換),通常是穩定的。

三、各算法穩定性分

算法

穩定性

原因分析

冒泡排序

穩定

只交換相鄰元素,> 才交換,== 不動

插入排序

穩定

插入時從後往前比較,<= 時不交換

選擇排序

不穩定

可能跨區交換,如 [5a, 3, 5b] → [3, 5b, 5a]

希爾排序

不穩定

跨 gap 交換,可能跳過相等元素

快速排序

不穩定

pivot 交換時可能讓相等元素越過

歸併排序

穩定

合併時若相等,優先取左邊元素

堆排序

不穩定

堆調整會跨層交換,打亂相等順序

桶排序

穩定

按順序分配或統計,不改變相對順序

✅ 一句話總結:

判斷排序算法是否穩定:
看它在相等元素時是否可能“跨越”或“交換”順序。

  • 相鄰交換 + 不動相等項 → 穩定
  • 跨區交換或重建結構 → 不穩定