Phép hoà nhập hai đ-ờng (two way merge)

Một phần của tài liệu Đề cương cấu trúc dữ liệu và giải thuật (Trang 32 - 34)

Giả sử ta có dãy khoá A gồm n phần tử, đã sắp xếp tăng dần và B là một dãy khoá khác gồm m phần tử cũng đã sắp xếp tăng dần.

Phép hợp nhất dãy A và dãy B thành một dãy đã đ-ợc sắp xếp bao gồm n+m phần tử đ-ợc gọi là phép hoà nhập hai đ-ờng.

*)ý t-ởng:

So sánh hai phần tử có giá trị nhỏ nhất của hai dãy. Chọn phần tử nhỏ hơn để đ-a vào một dãy sắp xếp riêng, sau đó loại phần tử đó ra khỏi dãy chứa nó.

Quá trình nh- vậy cứ tiếp tục cho tới khi một trong hai dãy hết ta chuyển dãy còn lại vào cuối dãy sắp xếp.

*)Thuật toán:

Var i,j,k,t:integer; Begin

{Khởi tạo các chỉ số} i:=1; j:=1; k:=1;

{So sánh để tạo các chỉ số} While i<=n and j<=m do

if A[i]<B[j] then begin C[k]:=A[i]; i:=i+1; k:=k+1; end; else begin C[k]:=B[j]; j:=j+1; k:=k+1;

end; {Một trong hai mạch đã cạn} if i>n then for t:=0 to m - j do C[k+t]:= B[j+t]; else for t:=0 to n - i do C[k+t]:=A[i+t]; End;

2.1.2.Sắp xếp kiểu hoà nhập hai đ-ờng trực tiếp (straight two - way merge)

*)Bài toán.

Sắp tăng dần dãy các số bằng thuật toán trộn hai đ-ờng trực tiếp.

*)ý t-ởng.

Mỗi phần tử trong dãy đã cho có thể coi là một dãy đã sắp xếp tăng dần. Vậy đẽ sắp xếp dãy A[i], A[i+1], A[i+2],..., A[j] ta quy vễ sắp xếp hai dãy con A[i],..., A[k] và A[k+1],..., A[j] với k = (i+j) div 2 => Sau đó hoà nhập hai dãy này đ-ợc một dãy sắp xếp.

Với ý t-ởng trên ta dùng giải thuật đệ quy để thực hiện việc chia dãy cần sắp xếp thành những dãy nhỏ hơn sau đó dùng thuật toán sắp xếp hoà nhập thành dãy sắp xếp.

*)Minh hoạ:

Giả sử A là dãy dùng để sắp thứ tự, A có nội dung nh- sau: A= { 9, 2, 90, 34, 3, 6, 11, 69, 5, 1, 20 }

Trong lần sắp xếp đầu tiên mỗi phần tử đ-ợc coi là một dãy đã sắp xếp A 9 2 90 34 3 6 11 69 5 20 1 Sang lần thứ 2:

Một phần của tài liệu Đề cương cấu trúc dữ liệu và giải thuật (Trang 32 - 34)

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

(56 trang)