[排序法] 常見的小序列排序法 – 插入排序法 Insertion sort

insertion sort 插入排序法

思維

當處理小序列時,傾向於使用可以達到 O(n) 時間複雜度的算法有以下幾個原因:

  1. 適應性:像插入排序這樣的算法能夠利用輸入數據的初始有序程度。如果數據已經部分排序(這在小數據集中更有可能),這類算法可以更接近線性性能
  2. 內存訪問小數據集可以完全容納在 CPU 快取中,這樣就減少了訪問主內存的需求。這可以顯著提高 O(n) 算法的速度,因為它們通常具有良好的空間局部性,可以充分利用快取
  3. 額外開銷:更複雜的算法(如快速排序或歸併排序)通常有更大的設定開銷(例如遞歸棧調用額外的內存分配)。在小數據集上,這種開銷可能不會得到足夠的平攤,從而使得簡單算法在性能上更有優勢。

排序法比較表格

排序演算法平均時間複雜度最好情況最壞情況空間複雜度排序方式穩定性
泡沫排序法O(n^2)O(n)O(n^2)O(1)原地排序穩定
插入排序法O(n^2)O(n)O(n^2)O(1)原地排序穩定
計數排序法O(n + k)O(n + k)O(n + k)O(k)非原地排序穩定
桶排序法O(n + k)O(n)O(n^2)O(n + k)非原地排序穩定

Round 1:

選手:泡沫排序法,插入排序法,計數排序法,桶排序法

非原地排序需要額外的內存分配很耗時,因此去除計數排序法,桶排序法

Round 2:

選手:泡沫排序法,插入排序法,計數排序法桶排序法

泡沫排序法在交換相鄰元素時,涉及到三次賦值操作(使用一個臨時變數進行交換)

插入排序法在找到插入點之前只需要將元素向後移動,這通常只涉及一次賦值操作

Winner: 插入排序法(Insertion sort)