Trong các thuật toán sắp xếp cơ bản, thuật toán insertion sort là một trong những giải thuật dễ hiểu và thường được giới thiệu đầu tiên cho người mới học lập trình. Dù không phải là thuật toán có hiệu năng cao nhất, nhưng insertion sort lại giúp người học hiểu rõ bản chất của quá trình sắp xếp dữ liệu. Vậy insertion sort hoạt động như thế nào? Khi nào nên sử dụng? Cùng Code Dream tìm hiểu chi tiết trong bài viết dưới đây.
Thuật toán Insertion Sort là gì?
Thuật toán insertion sort (sắp xếp chèn) là phương pháp sắp xếp xây dựng dãy đã sắp xếp từng bước một. Ý tưởng của insertion sort tương tự như cách bạn sắp xếp bài trên tay: lấy từng lá bài và chèn vào đúng vị trí trong nhóm bài đã được sắp xếp trước đó.
Cụ thể, thuật toán sẽ:
- Bắt đầu từ phần tử thứ hai của mảng
- So sánh với các phần tử phía trước
- Chèn phần tử vào vị trí phù hợp
- Lặp lại cho đến khi toàn bộ mảng được sắp xếp
Đây là một trong những thuật toán nền tảng khi học cấu trúc dữ liệu và thuật toán.

Cách hoạt động của thuật toán Insertion Sort
Để hiểu rõ thuật toán insertion sort, bạn có thể hình dung cách sắp xếp bài trên tay. Mỗi lần rút một lá bài mới, bạn sẽ chèn nó vào đúng vị trí trong nhóm bài đã được sắp xếp trước đó. insertion sort cũng hoạt động theo nguyên tắc tương tự.
Giả sử ta có mảng sau: 5 2 4 6 1 3
Quá trình của thuật toán insertion sort diễn ra như sau:
- Giữ nguyên phần tử đầu tiên (coi như đã sắp xếp).
- Lấy số 2 so với 5 → chèn 2 vào trước 5.
- Lấy số 4 → so sánh với 5 và 2 → chèn vào giữa.
- Tiếp tục với 6 → giữ nguyên vị trí.
- Lấy số 1 → dịch chuyển các phần tử lớn hơn sang phải và chèn vào đầu.
- Lặp lại với 3.
Sau khi hoàn tất, mảng sẽ trở thành: 1 2 3 4 5 6
Nguyên lý cốt lõi của insertion sort:
- Chia mảng thành hai phần: đã sắp xếp và chưa sắp xếp
- Lấy từng phần tử ở phần chưa sắp xếp
- Dịch chuyển các phần tử lớn hơn sang phải
- Chèn phần tử vào đúng vị trí
Chính nhờ cơ chế “dịch chuyển và chèn” này mà insertion sort hoạt động hiệu quả với mảng nhỏ hoặc mảng gần như đã được sắp xếp.
Cài đặt thuật toán Insertion Sort trong C++
Sau khi hiểu nguyên lý hoạt động, bước tiếp theo là triển khai thuật toán insertion sort bằng C++. Điểm quan trọng khi cài đặt là phải xác định đúng phần tử “key” và liên tục dịch chuyển các phần tử lớn hơn về phía sau để tạo vị trí chèn phù hợp.
Dưới đây là ví dụ cài đặt insertion sort đơn giản, dễ hiểu:

Trong đó:
- Vòng lặp for bắt đầu từ phần tử thứ 2 (chỉ số 1).
- Biến key lưu giá trị cần được chèn vào đúng vị trí.
- Vòng while dùng để so sánh và dịch chuyển các phần tử lớn hơn key.
- Sau khi tìm được vị trí thích hợp, gán key vào arr[j + 1].
Với cách cài đặt này, thuật toán insertion sort giúp mảng được sắp xếp tăng dần mà không cần dùng thêm bộ nhớ phụ, rất phù hợp cho người mới học C++ và làm quen với tư duy giải thuật.
Độ phức tạp của thuật toán Insertion Sort
Khi phân tích thuật toán insertion sort, chúng ta cần xem xét hai yếu tố chính: thời gian thực thi (time complexity) và bộ nhớ sử dụng (space complexity). Đây là cơ sở để đánh giá hiệu quả thuật toán trong từng trường hợp cụ thể.
Hiệu suất của insertion sort phụ thuộc vào mức độ sắp xếp ban đầu của dữ liệu:
- Trường hợp tốt nhất – O(n):
Xảy ra khi mảng đã được sắp xếp tăng dần. Khi đó, mỗi phần tử chỉ cần so sánh một lần mà không phải dịch chuyển. Thuật toán chỉ duyệt qua mảng đúng một vòng lặp chính. - Trường hợp trung bình – O(n²):
Với dữ liệu ngẫu nhiên, mỗi phần tử có thể phải so sánh và dịch chuyển nhiều lần về phía trước. Số thao tác tăng theo bình phương số phần tử. - Trường hợp xấu nhất – O(n²):
Xảy ra khi mảng được sắp xếp ngược hoàn toàn. Mỗi phần tử mới phải so sánh với toàn bộ các phần tử trước đó và dịch chuyển nhiều bước để chèn vào đúng vị trí.
Như vậy, về mặt thời gian, thuật toán insertion sort không phù hợp với dữ liệu lớn nhưng lại hoạt động rất tốt khi dữ liệu gần như đã có thứ tự.
Bên cạnh đó, Insertion sort có độ phức tạp bộ nhớ O(1) vì:
- Không sử dụng mảng phụ
- Chỉ dùng một vài biến tạm (như biến key)
Đây là thuật toán sắp xếp in-place, giúp tiết kiệm tài nguyên hệ thống.
So sánh Insertion Sort với Bubble Sort và Selection Sort:
| Tiêu chí | Insertion Sort | Bubble Sort | Selection Sort |
| Độ phức tạp tốt nhất | O(n) | O(n) (có tối ưu) | O(n²) |
| Độ phức tạp trung bình | O(n²) | O(n²) | O(n²) |
| Độ phức tạp xấu nhất | O(n²) | O(n²) | O(n²) |
| Số lần hoán đổi | Ít | Nhiều | Ít |
| Hiệu quả với dữ liệu gần sắp xếp | Rất tốt | Tốt | Kém |
| Độ phức tạp bộ nhớ | O(1) | O(1) | O(1) |
Khi nào nên sử dụng thuật toán Insertion Sort?
Mặc dù thuật toán insertion sort không phải là lựa chọn tối ưu cho dữ liệu lớn, nhưng trong nhiều trường hợp thực tế, insertion sort lại phát huy hiệu quả rất tốt nhờ tính đơn giản và tiết kiệm bộ nhớ.
Bạn nên sử dụng insertion sort khi:
- Tập dữ liệu nhỏ: Với số lượng phần tử không quá lớn (ví dụ dưới vài trăm phần tử), insertion sort hoạt động nhanh và không tạo ra độ trễ đáng kể.
- Dữ liệu gần như đã được sắp xếp: Đây là tình huống lý tưởng vì thuật toán có thể đạt độ phức tạp O(n), giúp xử lý cực kỳ hiệu quả.
- Yêu cầu tiết kiệm bộ nhớ: Do hoạt động theo cơ chế in-place và chỉ dùng biến tạm, thuật toán insertion sort phù hợp với môi trường hạn chế tài nguyên.
- Cần thuật toán ổn định (stable sort): insertion sort giữ nguyên thứ tự tương đối của các phần tử bằng nhau.
- Học tập và rèn luyện tư duy giải thuật: Với cơ chế chèn trực quan, insertion sort là nền tảng quan trọng giúp người học hiểu sâu về cách các thuật toán sắp xếp hoạt động.
Trong thực tế, nhiều thuật toán sắp xếp nâng cao còn kết hợp insertion sort để xử lý các mảng con kích thước nhỏ nhằm tối ưu hiệu năng tổng thể. Vì vậy, dù đơn giản, thuật toán insertion sort vẫn giữ vai trò quan trọng trong cả học thuật lẫn ứng dụng thực tiễn.
Câu hỏi thường gặp về Insertion Sort
Sau khi hiểu khi nào nên sử dụng, dưới đây là những câu hỏi phổ biến giúp bạn nắm rõ hơn về thuật toán Insertion Sort:
- Insertion Sort có phải là thuật toán in-place không?
Có. Thuật toán không sử dụng thêm bộ nhớ phụ, chỉ dùng một vài biến tạm nên rất tiết kiệm tài nguyên (O(1)).
- Insertion Sort có ổn định không?
Có. Thuật toán giữ nguyên thứ tự tương đối của các phần tử có giá trị bằng nhau (stable sort).
- Insertion Sort có phù hợp để thi học sinh giỏi không?
Có. Đây là thuật toán cơ bản giúp rèn tư duy và thường được dùng trong các bài toán nhỏ hoặc làm bước tối ưu trong thuật toán lớn.
- Insertion Sort có thể tối ưu được không?
Có. Có thể kết hợp với Binary Search để giảm số lần so sánh (Binary Insertion Sort), tuy nhiên vẫn phải dịch chuyển phần tử nên độ phức tạp tổng thể vẫn là O(n²).
- Vì sao nhiều thuật toán nâng cao vẫn dùng Insertion Sort?
Vì với các mảng con nhỏ, Insertion Sort chạy rất nhanh và đơn giản, giúp tối ưu hiệu năng tổng thể của thuật toán lớn như Quick Sort hay Merge Sort.
Học thuật toán hiệu quả cùng Code Dream
Hiểu thuật toán insertion sort chỉ là bước khởi đầu. Để thực sự giỏi lập trình, bạn cần một lộ trình học rõ ràng, được hướng dẫn đúng phương pháp và có môi trường thực hành nghiêm túc. Đó chính là định hướng đào tạo tại Trung tâm Tin học Code Dream.

Code Dream không dạy theo cách học thuộc công thức. Thay vào đó, trung tâm tập trung vào:
- Xây dựng tư duy logic và nền tảng cấu trúc dữ liệu vững chắc
- Phân tích bản chất từng thuật toán, hiểu vì sao chạy được chứ không chỉ biết viết code
- So sánh và đánh giá độ phức tạp để chọn giải pháp tối ưu
- Thực hành chuyên sâu với hệ thống bài tập phân cấp từ cơ bản đến nâng cao
Điểm khác biệt nổi bật của Code Dream là giáo trình được biên soạn độc quyền, thiết kế theo lộ trình hệ thống hóa toàn bộ kiến thức C++ và giải thuật. Nội dung được cập nhật sát chương trình học phổ thông, đại học và định hướng thi học sinh giỏi, thi đại học hoặc theo đuổi ngành Công nghệ Thông tin.
Bên cạnh đó, đội ngũ giảng viên tại Code Dream là những người có kinh nghiệm giảng dạy và chuyên môn vững vàng, luôn theo sát từng học viên. Lớp học được tổ chức với quy mô hợp lý để đảm bảo mỗi bạn đều được hỗ trợ kịp thời khi gặp khó khăn.
Nếu bạn muốn học lập trình thuật toán một cách hệ thống, có lộ trình rõ ràng và được hướng dẫn bởi đội ngũ tận tâm, Code Dream chính là điểm khởi đầu vững chắc cho hành trình lập trình của bạn.
Đăng ký ngay khóa học tại https://codedream.edu.vn/ và bắt đầu hành trình học lập trình hiệu quả ngay hôm nay.





