Insertion Sort: Thuật toán sắp xếp cơ bản và ứng dụng

Trịnh Thị Ngọc Trịnh Thị Ngọc

Giới thiệu về thuật toán Insertion Sort

Trong thế giới của khoa học dữ liệu và lập trình, việc sắp xếp dữ liệu theo một trật tự nhất định là một yêu cầu cơ bản nhưng vô cùng quan trọng. Insertion Sort là một trong những thuật toán sắp xếp đơn giản và hiệu quả, đặc biệt phù hợp với các tập dữ liệu nhỏ hoặc dữ liệu đã gần như được sắp xếp. Với cách tiếp cận trực quan, thuật toán này giúp người học dễ dàng hình dung quá trình sắp xếp.

Điểm cốt lõi của Insertion Sort: Thuật toán hoạt động bằng cách xây dựng dần một mảng đã sắp xếp bằng cách lấy từng phần tử từ mảng chưa sắp xếp và chèn nó vào đúng vị trí trong phần mảng đã sắp xếp.

Insertion Sort hoạt động như thế nào?

Insertion Sort hoạt động dựa trên nguyên lý mô phỏng cách con người sắp xếp các quân bài trên tay. Quá trình này có thể được mô tả qua các bước sau:

  1. Chia mảng thành hai phần: Một phần chứa các phần tử đã được sắp xếp và phần còn lại chứa các phần tử chưa sắp xếp. Ban đầu, phần tử đầu tiên của mảng được coi là phần đã sắp xếp.
  2. Lấy phần tử tiếp theo: Thuật toán lấy một phần tử từ phần chưa sắp xếp.
  3. Tìm vị trí chèn: Phần tử vừa lấy sẽ được so sánh với các phần tử trong phần đã sắp xếp, di chuyển lùi về phía sau cho đến khi tìm được vị trí mà phần tử đó có thể được chèn vào sao cho vẫn duy trì được thứ tự sắp xếp.
  4. Chèn phần tử: Phần tử được chèn vào vị trí đã tìm thấy.
  5. Lặp lại: Quá trình này lặp lại cho đến khi tất cả các phần tử từ mảng chưa sắp xếp được chèn vào phần đã sắp xếp, hoàn thành việc sắp xếp toàn bộ mảng.

Ví dụ minh họa với mảng [ 7, 12, 9, 11, 3 ]:

  • Bắt đầu với mảng chưa sắp xếp: [ 7, 12, 9, 11, 3 ]. Phần tử đầu tiên 7 được coi là mảng đã sắp xếp.
  • Xét phần tử tiếp theo là 12. Vì 12 > 7, nó đã ở đúng vị trí. Mảng đã sắp xếp: [ 7, 12 ].
  • Xét phần tử tiếp theo là 9. So sánh 9 với 12, 9 < 12, nên 12 dịch sang phải. So sánh 9 với 7, 9 > 7, nên 9 được chèn vào giữa 712. Mảng đã sắp xếp: [ 7, 9, 12 ].
  • Xét phần tử tiếp theo là 11. So sánh 11 với 12, 11 < 12, 12 dịch sang phải. So sánh 11 với 9, 11 > 9, nên 11 được chèn vào giữa 912. Mảng đã sắp xếp: [ 7, 9, 11, 12 ].
  • Cuối cùng, xét phần tử 3. 3 nhỏ hơn tất cả các phần tử đã sắp xếp, nên nó được chèn về đầu mảng. Mảng đã sắp xếp: [ 3, 7, 9, 11, 12 ].
Minh họa quá trình chèn phần tử vào mảng đã sắp xếp trong Insertion Sort
Quá trìnhInsertion Sort từng bước minh họa cho việc chèn phần tử vào đúng vị trí.

Code minh họa Insertion Sort bằng C++

Dưới đây là đoạn mã C++ cài đặt thuật toán Insertion Sort:

#include <iostream> using namespace std; /* Function to sort array using insertion sort */ void insertionSort(int arr[], int n) { for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; /* Move elements of arr[0..i-1], that are greater than key, to one position ahead of their current position */ while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } /* A utility function to print array of size n */ void printArray(int arr[], int n) { for (int i = 0; i < n; ++i) cout << arr[i] << " "; cout << endl; } // Driver method int main() { int arr[] = {12, 11, 13, 5, 6}; int n = sizeof(arr) / sizeof(arr[0]); insertionSort(arr, n); printArray(arr, n); return 0; } 

Ưu và nhược điểm của Insertion Sort

Mỗi thuật toán đều có những điểm mạnh và hạn chế riêng. Insertion Sort cũng không ngoại lệ:

Ưu điểm

  • Đơn giản: Dễ hiểu, dễ cài đặt.
  • Hiệu quả với dữ liệu nhỏ: Hoạt động tốt khi số lượng phần tử ít.
  • Hiệu quả với dữ liệu gần sắp xếp: Nếu mảng đã gần như sắp xếp, Insertion Sort có thể chạy rất nhanh.
  • Sắp xếp tại chỗ (In-place): Chỉ yêu cầu một lượng bộ nhớ phụ nhỏ không đáng kể.
  • Ổn định (Stable): Các phần tử có giá trị bằng nhau sẽ giữ nguyên thứ tự tương đối của chúng sau khi sắp xếp.
Biểu đồ hiệu suất của Insertion Sort so với các thuật toán khác
Biểu đồ minh họa sự khác biệt về hiệu suất giữa Insertion Sort và các thuật toán khác theo độ phức tạp của dữ liệu.

Nhược điểm

  • Chậm với dữ liệu lớn: Độ phức tạp thời gian là O(n^2) trong trường hợp xấu nhất và trung bình, khiến nó không hiệu quả với các tập dữ liệu lớn.
  • Không phù hợp cho việc sắp xếp song song.

So sánh Insertion Sort với các thuật toán sắp xếp khác

Khi lựa chọn thuật toán sắp xếp, việc hiểu rõ điểm mạnh của từng loại là rất quan trọng. Insertion Sort thường được so sánh với các thuật toán phổ biến khác như Bubble Sort, Selection Sort, Merge Sort, và Quick Sort.

Thuật toán Độ phức tạp Thời gian (Trung bình) Độ phức tạp Không gian Tính ổn định
Insertion Sort O(n^2) O(1)
Bubble Sort O(n^2) O(1)
Selection Sort O(n^2) O(1) Không
Merge Sort O(n log n) O(n)
Quick Sort O(n log n) O(log n) Không

Ứng dụng của Insertion Sort

Mặc dù có độ phức tạp thời gian không lý tưởng cho dữ liệu lớn, Insertion Sort vẫn có những ứng dụng quan trọng:

  • Sắp xếp các tập dữ liệu nhỏ: Khi số lượng phần tử ít, hiệu suất của Insertion Sort có thể cạnh tranh hoặc thậm chí vượt trội so với các thuật toán phức tạp hơn.
  • Sử dụng trong các thuật toán khác: Insertion Sort thường được dùng làm một phần của các thuật toán sắp xếp phức tạp hơn như Introsort hoặc Timsort. Các thuật toán này sẽ sử dụng Insertion Sort khi kích thước của các phân đoạn dữ liệu trở nên đủ nhỏ.
  • Sắp xếp dữ liệu gần sắp xếp: Nếu dữ liệu đầu vào đã gần như được sắp xếp, Insertion Sort có thể đạt hiệu suất gần tuyến tính (O(n)).

Việc hiểu rõ insertion sort là gì và cách nó hoạt động giúp các lập trình viên đưa ra lựa chọn thuật toán phù hợp với từng bài toán cụ thể, tối ưu hóa hiệu suất chương trình.

Minh họa trực quan thuật toán Insertion Sort
Hình ảnh minh họa trực quan cho thấy cách Insertion Sort thực hiện việc chèn phần tử vào mảng.

Lời kết

Insertion Sort, dù không phải là lựa chọn tối ưu cho việc xử lý các tập dữ liệu khổng lồ, nhưng vẫn giữ vững vị trí của mình như một công cụ học thuật giá trị và một thành phần hữu ích trong các thuật toán sắp xếp phức tạp hơn. Khả năng hoạt động hiệu quả trên dữ liệu nhỏ hoặc gần sắp xếp, cùng với sự đơn giản trong cài đặt, làm cho nó trở thành một phần không thể thiếu trong bộ công cụ của mọi lập trình viên. Việc nắm vững insertion sort visualizationnguyên lý hoạt động của nó sẽ giúp bạn giải quyết các vấn đề sắp xếp một cách hiệu quả hơn.

Trịnh Thị Ngọc
Trịnh Thị Ngọc

Lập trình viên full-stack với 9 năm kinh nghiệm. Thành thạo JavaScript, Python và frameworks hiện đại.

Xem tất cả bài viết

Bình luận

N

Nguyễn Văn An

19:20:12 22-07-2026

Bài viết rất rõ ràng, giải thích từng bước của Insertion Sort rất dễ hiểu. Cảm ơn bạn đã chia sẻ mã nguồn C++!