Mục tiêu:
- Mô phỏng được giải thuật, cách cài đặt của phương pháp sắp xếp chèn;
- Giải được các bài toán sắp xếp sử dụng các phương pháp sắp xếp đã khảo sát.
3.1.Giới thiệu phương pháp
Giả sử có một dãya1, a2,... ,an trong đó i phần tử đầu tiêna1, a2,... ,ai-1 đã có thứ tự. Ý tưởng chính của giải thuật sắp xếp bằng phương pháp chèn trực tiếp là 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ớia1, a2,... ,ai
trở nên có thứ tự. Vị trí này chính là vị trí giữa hai phần tửak-1vàak thỏaak-1 ≤ ai < ak
Cho dãy ban đầua1, a2,... ,an, ta có thể xem như đã có đoạn gồm một phần tử a1
đã được sắp, sau đó thêma2 vào đoạn a1sẽ có đoạn a1a2 được sắp; tiếp tục thêm a3
vào đoạn a1a2để có đoạn a1 a2 a3 được sắp; tiếp tục cho đến khi thêm xongaN vào đoạna1 a2 ...aN-1 sẽ có dãy a1a2.... aNđược sắp
3.2.Giải thuật
Các bước thực hiện ý tưởng giải thuật như sau:
Bước 1: i = 2; // giả sử có đoạn a[1]đã được sắp Bước 2: x = a[i];
Tìm vị trí j thích hợp trong đoạn a[1] đến a[i-1] để chèn a[i] vào Bước 3: Dời chỗ các phần tử từ a[j] đến a[i-1] sang phải 1 vị trí để dành chổ cho a[i]
Bước 4: a[j] = x; // có đoạn a[1]..a[i] đã được sắp Bước 5: i = i+1;
Nếu i≤ n : Lặp lại Bước 2. Ngược lại : Dừng.
Cài đặt thuật toán:
Procedure InsSort; Var i,j :Integer ; Begin
for i:=2 to n do {xem như phần tử đầu tiên đã sắp xếp}
Begin
Tam:=A[i]; {Lưu lại phần tử đang xét để tìm vị trí chèn vào} j:=i-1; { duyệt dãy con còn lại bắt đầu từ i-1}
while(Tam<A[j]) do Begin A[j+1]:=A[j];{nhích các phần tử ra 1 vị trí} j:=j-1; End; A[j+1]:=Tam; End; {for} End; 3.3.Ví dụ minh họa
Sắp xếp dãy gồm 10 mẩu tin đã cho ở trên có khóa là các số nguyên: 5, 6, 2, 2, 10, 12, 9, 10, 9 và 3.
Bước 1: Xen a[2] vào dãy chỉ có một phần tử a[1] ta được dãy hai phần tử a[1]..a[2] có thứ tự. Việc xen này thực ra không phải làm gì cả vì hai phần tử a[1], a[2] có khoá tương ứng là 5 và 6 đã có thứ tự.
Bước 2: Xen a[3] vào dãy a[1]..a[2] ta được dãy ba phần tử a[1]..a[3] có thứ tự. Việc xen này được thực hiện bằng cách : so sánh khoá của a[3] với khoá của a[2], do khoá của a[3] nhỏ hơn khoá của a[2] (2<6) nên hoán đổi a[3] và a[2] cho nhau. Lại so sánh khoá của a[2] với khoá của a[1], do khoá của a[2] nhỏ hơn khoá của a[1] (2<5) nên hoán đổi a[2] và a[1] cho nhau.
Tiếp tục quá trình này và sau 9 bước thì kết thúc.
Bảng sau ghi lại các giá trị khoá tương ứng với từng bước.
A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
Ban đầu 5 6 2 2 10 12 9 10 9 3
Bước 1 5 6
Bước 3 2 2 5 6 Bước 4 2 2 5 6 10 Bước 5 2 2 5 6 10 12 Bước 6 2 2 5 6 9 10 12 Bước 7 2 2 5 6 9 10 10 12 Bước 8 2 2 5 6 9 9 10 10 12 Bước 9 2 2 3 5 6 9 9 10 10 12