Thuật toán sắp xếp hoà nhập

Một phần của tài liệu một số vấn đề ứng dụng của đồ thị trong tin học (Trang 65 - 68)

I. Các khái niệm và tính chất cơ bản

4.4.2Thuật toán sắp xếp hoà nhập

4. Các ứng dụng

4.4.2Thuật toán sắp xếp hoà nhập

Giả sử ta có danh sách chưa được sắp 8, 2, 4, 6, 9, 7, 10, 1, 5 ,3 có thể dùng cây nhị phân mô tả quá trình sắp xếp danh sách theo thứ tự tăng dần như sau: Cây nhị phân với gốc được gán là chính là danh sách đó. Các con của gốc được gán theo nguyên tắc: Con bên trái gán nửa danh sách đầu, con bên phải gán nửa danh sách còn lại (danh sách gán ở gốc cây con trái và cây con phải hoặc bằng nhau về số lượng hoặc chênh lệch nhau 1 phần tử).

Cứ tiếp tục cho tới khi cây nhị phân có mỗi lá được gán 1 phần tử trong dãy. Đó là cây như hình 1.7

8, 2, 4, 6, 9, 7, 10, 1, 5, 3

8, 2, 4, 6, 9 7, 10, 1, 5, 3

8, 2, 4 6, 9 7, 10, 1 5, 3

Hình 1.7

Đây là cây nhị phân đầy đủ chưa phải cây sắp xếp của dãy đã cho ở trên

Hình 1.8

Để có cây nhị phân sắp xếp của một dãy, trước hết cây được xây dựng tương tương tự như vậy, mỗi lá tương ứng với mỗi phần tử của dãy. Bước đầu tiên 2 phần tử được hoà nhập vào 1 danh sách theo thứ tự tăng dần, danh sách tương ứng này như một nút cha, 2 phần tử được hoà nhập là nút con. Sau đó ta tiếp tục hoà nhập các cặp nút tương tự như vậy cho tới toàn bộ danh sách được sắp xếp lại theo thứ tự tăng dần và cây biểu diễn cho dãy là cây nhị phân cân đối được mô tả như hình 1.8

Các bước thuật toán trên được mô tả trên là đã vận dụng thuật toán hoà nhập hai danh sách đã được sắp xếp thành một danh sách mới được sắp xếp, thuật toán này theo nguyên tắc sau:

- So sánh phần tử bé nhất trong danh sách trong danh sách thứ nhất với phần tử bé nhất trong danh sách thứ 2.

- Quá trình trên được lặp lại cho 2 danh sách nhận được ở bước trên - Sau một số bước sẽ gặp hai trường hợp sau:

a) Cả 2 danh sách trở thành rỗng. Trong trường hợp này, các phần tử có mặt trong danh sách hoà nhập chính là danh sách cần xác định

8 2 7 10

2, 8 4 6 9 7, 10 1 5 3

2, 4, 8 6, 9 1,7, 10 3, 5

2, 4, 6, 8,9 1, 3,5, 7, 10

b) Một danh sách trở thành rỗng, còn danh sách kia khác rỗng. Trong trường hợp này đưa các phần tử còn lại (trong danh sách không rỗng) nối vào cuối của danh sách hoà nhập.

Độ phức tạp thuật toán của thuật toán trên là O(nlogn) trong đó n là số phần tử hoà nhập

Chương trình bằng ngôn ngữ Pascal thể hiện thuật toán hoà nhập như sau: Const n = 10;

Type Vec = Array[1..n] of Integer;

Const cm:Vec = (-3,3,-1,4,1,5,6,7,-8,-9); Var x,y:Vec;

Procedure Viet; Var i:byte; Begin

For i:=1 to n do Write(x[i]:3); Writeln; End;

Procedure Hoa_nhap2p(x:Vec; p,m,n:Integer; Var z:Vec); Var i,j,k: Integer;

Begin

i:=p;j:=m+1;k:=p;

While (i<=m) and (j<=n) do Begin If x[i]<x[j] Then Begin

z[k]:=x[i];inc(i); End

Else Begin z[k]:=x[j];inc(j);End; Inc(k); End; If i>m Then for K:=j to n Do z[k]:=x[k] Else for k:=i to m Do z[n+k-m]:=x[k]; End; Procedure Merge(l,r:integer); (adsbygoogle = window.adsbygoogle || []).push({});

Var i,m:integer; Begin

If l<r Then Begin m:=(l+r) div 2;

Merge(l,m); Merge(m+1,r); For i:=l to r do y[i]:=x[i]; Hoa_nhap2p(y,l,m,r,x); End; End; BEGIN X := cm; Viet; Merge(1,n); Viet; END.

Một phần của tài liệu một số vấn đề ứng dụng của đồ thị trong tin học (Trang 65 - 68)