Ý tưởng: Giống cách bạn sắp xếp bài trên tay — lấy từng lá bài mới và chèn vào đúng vị trí trong phần đã sắp xếp.
- Xét phần tử thứ
i(gọi làkey) - So sánh
keyvới các phần tử bên trái (phần đã sắp xếp) - Dịch các phần tử lớn hơn
keysang phải một vị trí - Chèn
keyvào vị trí trống — lặp lại từi = 1đếnn-1
#include <bits/stdc++.h>
using namespace std;
void insertionSort(vector<int>& a) {
int n = a.size();
for (int i = 1; i < n; i++) {
int key = a[i];
int j = i - 1;
// Dịch các phần tử > key sang phải
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = key; // Chèn key vào vị trí đúng
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
insertionSort(a);
for (int x : a) cout << x << " ";
return 0;
}
- Simple, dễ code
- Stable — giữ thứ tự phần tử bằng nhau
- In-place — O(1) bộ nhớ phụ
- Best case O(n) khi mảng gần sắp xếp
- Hiệu quả với mảng nhỏ (n ≤ 1000)
- Worst/Average: O(n²)
- Nhiều phép dịch chuyển (shifts)
- Không phù hợp mảng lớn