Xây dần một vùng đã sắp xếp ở đầu mảng, mỗi bước lấy phần tử tiếp theo và chèn vào đúng vị trí — hiệu quả với mảng nhỏ hoặc gần như đã sắp xếp.
Insertion Sort là cách con người thực sự sắp xếp một cỗ bài trên tay — cầm từng lá, tìm chỗ đúng, nhét vào.
Vẫn là sắp xếp mảng tăng dần — lần này mô phỏng đúng trực giác con người: giữ một "cỗ bài đã sắp xếp" ở tay trái, lần lượt rút từng lá từ cỗ chưa sắp và chèn vào đúng chỗ trong cỗ đã sắp.
Coi mảng có hai vùng: vùng đã sắp xếp (bên trái) và vùng chưa xử lý (bên phải). Ở mỗi bước,
lấy phần tử đầu tiên của vùng chưa xử lý (key), rồi dịch các phần tử lớn hơn key trong vùng đã
sắp sang phải để nhường chỗ, cuối cùng đặt key vào đúng vị trí trống.
Khác với Bubble/Selection Sort (luôn quét toàn bộ phần còn lại), Insertion Sort chỉ cần quét đến
khi tìm được vị trí đúng — nếu mảng gần như đã sắp xếp sẵn, vòng while gần như không chạy lần nào.
| Trường hợp | Thời gian | Ghi chú |
|---|---|---|
| Tốt nhất (đã sắp xếp) | O(n) | Mỗi key đã đúng chỗ ngay, không cần dịch |
| Xấu nhất (ngược hoàn toàn) | O(n²) | Mỗi phần tử phải dịch qua toàn bộ vùng đã sắp |
| Không gian | O(1) | Sắp xếp tại chỗ |
So với Bubble/Selection Sort: cùng O(n²) trường hợp xấu nhất, nhưng Insertion Sort thích ứng rất tốt với dữ liệu "gần đã sắp xếp" — đây là lý do nhiều thư viện chuẩn (Timsort, Introsort) dùng Insertion Sort cho các đoạn mảng con nhỏ.
Mảng [6, 2, 9, 4]:
[6, 6, 9, 4] → chèn 2 → [2, 6, 9, 4][2, 6, 9, 4][2, 4, 6, 9]Kiểm tra nhanh
Insertion Sort đạt độ phức tạp O(n) khi nào?