Phương pháp chèn (Insertion sort)

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (nghề lập trình viên máy tính cao đẳng) (Trang 41 - 43)

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-1ak 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

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (nghề lập trình viên máy tính cao đẳng) (Trang 41 - 43)

Tải bản đầy đủ (PDF)

(65 trang)