a. Ý tƣởng
Nhận xét :
Mọi dãy a[0] , a[1] ,..., a[n-1]luơn cĩ i-1 phần tử đầu tiên a[0] , a[1] ,..., a[i-2]đã cĩ thứ tự (2 ≤ i).
Ý tưởng chính:
Tìm cách chèn phần tử aivào vị trí thích hợp của đoạn đã đƣợc sắp để cĩ dãy mới a[0] , a[1] ,... ,a[i-1]trở nên cĩ thứ tự.
Vị trí này chính là pos thỏa :a[pos-1]a[i ]< a[pos](1posi).
Chi tiết hơn:
Dãy ban đầua[0] , a[1] ,..., a[n-1], xem như đã cĩ đoạn gồm một phần tử a[0]đã được sắp.
Thêma[1] vào đoạna[0]sẽ cĩ đoạn a[0] a[1]được sắp
Thêma[2] vào đoạna[0] a[1] để cĩ đoạn a[0] a[1] a[2]được sắp
Tiếp tục cho đến khi thêm xong a[n-1] vào đoạna[0] a[1] ...a[n-1]sẽ cĩ dãy a[0] a[1]….....A[n-1]được sắp.
b. Thuật tốn
//input: dãy (a, n)
//output: dãy (a, n) đã được sắp xếp
Bƣớc 1: i = 2; // giả sử cĩ đoạna[0]đã được sắp
Bƣớc 2: x = a[i]; Tìm vị trí pos thích hợp trong đoạn a[0] đến a[i] để chèn x vào
Bƣớc 3: Dời chỗ các phần tử từ a[pos] đến a[i-1] sang phải 1 vị trí để dành chổ cho x
Bƣớc 4: a[pos] = x;// cĩ đoạna[0]..a[i] đã được sắp
Bƣớc 5: i = i+1;
Nếu in : Lặp lại Bƣớc 2. Ngƣợc lại : Dừng.
Ví dụ minh họa A[]: 12 2 8 5 1 6 4 15 i=2; x=2 1 2 3 4 5 6 7 8 2 12 8 5 1 6 4 15 i=3; x=8 1 2 3 4 5 6 7 8 2 8 12 5 1 6 4 15 i=4; x=5 1 2 3 4 5 6 7 8 2 5 8 12 1 6 4 15 i=5; x=1 1 2 3 4 5 6 7 8 1 2 5 8 12 6 4 15 i=6; x=6 1 2 3 4 5 6 7 8 1 2 5 6 8 12 4 15 i=7; x=4 1 2 3 4 5 6 7 8 1 2 4 5 6 8 12 15 i=8; x=15 1 2 3 4 5 6 7 8 1 2 4 5 6 8 12 15 c. Cài đặt thuật tốn:
void InsertionSort(int a[], int n ) { int pos, x;
for(int i=0 ; i<n ; i++)//đoạn a[0] đã sắp
{ x = a[i+1];pos= i; while(pos>=0 && a[pos]>x) { a[pos+1] = a[pos];
pos--;
}
a[pos]=x;
}
Nhận xét
Khi tìm vị trí thích hợp để chèn a[i] vào đoạn a[0] đến a[i-1], do đoạn đã đƣợc sắp cĩ thể sử dụng giải thuật tìm nhị phân để thực hiện việc tìm vị trí posgiải thuật sắp xếp chèn nhị phânBinary Insertion Sort
Lưu ý:Chèn nhị phân chỉ làm giảm số lần so sánh, khơng làm giảm số lần dời chỗ. Ngồi ra, cĩ thể cải tiến giải thuật chèn trực tiếp với phần tử cầm canh để giảm điều kiện kiểm tra khi xác định vị trí pos.
d. Đánh giá giải thuật
Các phép so sánh xảy ra trong mỗi vịng lặp tìm vị trí thích hợp pos. Mỗi lần xác định vị trí pos đang xét khơng thích hợpdời chỗ phần tử a[pos-1] đến vị trí pos.
Giải thuật thực hiện tất cả N-1 vịng lặp tìm pos, do số lƣợng phép so sánh và dời chỗ này phụ thuộc vào tình trạng của dãy số ban đầu, nên chỉ cĩ thể ƣớc lƣợc trong từng trƣờng hợp nhƣ sau: