插入排序是一種簡單直觀的排序演算法,其核心思想是將陣列分為「已排序」與「未排序」兩部分,每次從未排序區取出一個元素,在已排序區中從後向前掃描並找到適當位置插入。雖然平均時間複雜度為 O(n²),但在資料量小或近乎有序時表現優異,且為穩定排序、原地排序 (空間複雜度 O(1))。
key = arr[i]。i-1 向前比較,若元素大於 key 則向後移動一位。key 放入。public static class InsertSort
{
public static void Sort(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
{
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
}
// 測試
static void Main()
{
int[] data = { 20, 41, 27, 14, 16, 1, 8, 55, 9, 35, 22, 14 };
InsertSort.Sort(data);
Console.WriteLine("插入排序結果:" + string.Join(", ", data));
}
| 情況 | 時間複雜度 | 說明 |
|---|---|---|
| 最佳 | O(n) | 陣列已有序,內層迴圈不執行 |
| 平均 | O(n²) | 隨機資料 |
| 最差 | O(n²) | 陣列逆序 |
| 空間 | O(1) | 原地排序 |
實際專案中極少手寫排序,應優先使用 Array.Sort 或 List<T>.Sort (內部採用 Introspective Sort:快速排序 + 堆積排序 + 插入排序混合)。理解演算法原理有助於: