Phân loại | Sắp xếp chèn |
---|---|
Cấu trúc dữ liệu | Cấu trúc dữ liệu mảng |
Hiệu suất trường hợp tệ nhất | О(n2) |
Hiệu suất trường hợp tốt nhất | O(n) |
Hiệu suất trung bình | О(n2) |
Độ phức tạp không gian trường hợp tệ nhất | О(n) tổng, O(1) phụ |
Tối ưu | Không có |
Sắp xếp chèn (insertion sort) là một thuật toán sắp xếp bắt chước cách sắp xếp quân bài của những người chơi bài. Muốn sắp một bộ bài theo trật tự người chơi bài rút lần lượt từ quân thứ 2, so với các quân đứng trước nó để chèn vào vị trí thích hợp.
Cơ sở lập luận của sắp xếp chèn có thể mô tả như sau: Xét danh sách con gồm k phần tử đầu . Với k = 1, danh sách gồm một phần tử đã được sắp. Giả sử trong danh sách k-1 phần tử đầu đã được sắp. Để sắp xếp phần tử ta tìm vị trí thích hợp của nó trong dãy . Vị trí thích hợp đó là đứng trước phần tử lớn hơn nó và sau phần tử nhỏ hơn hoặc bằng nó.
Các phần tử ≤x | Vị trí thích hợp | Các phần tử>x | Các phần tử chưa sắp | ||||||
... | x | ... | ... |
Cho danh sách
1 | 3 | 7 | - | 6 | 4 | 2 | 5 |
Danh sách con gồm 3 phần tử bên trái 1,3,7 đã được sắp. Để tiếp tục sắp xếp phần tử thứ tư vào danh sách con đó, ta tìm vị trí thích hợp của nó là sau 3 và trước 7.
1 | 3 | 6 | 7 | - | 4 | 2 | 5 |
Làm tiếp theo với ta được
1 | 3 | 4 | 6 | 7 | - | 2 | 5 |
Làm tiếp theo với ta được
1 | 2 | 3 | 4 | 6 | 7 | - | 5 |
Cuối cùng chèn
1 | 2 | 3 | 4 | 5 | 6 | 7 | - |
Procedure insert (array a, int k, value) { int i:= k-1; while (i > 0 and a[i] > value) { a[i+1]:= a[i]; i:= i - 1; } a[i+1]:= value; }
Procedure InsertSort (array a, int length) { int k:= 2; while (k < length) { insert(a, k, a[k]); k:= k + 1; } }
// Mã giả viết bằng ngôn ngữ C++
void InsertSort (int a[],int n) { int t,j; for(int i=1;i<n;i++) { j=i-1; t=a[i]; while(j >= 0 && t < a[j]) { a[j+1]=a[j]; j--; } a[j+1]=t; // Chèn } }