Sắp xếp chèn với tìm kiếm nhị phân

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 63 - 65)

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

4.4.1Sắp xếp chèn với tìm kiếm nhị phân

4. Các ứng dụng

4.4.1Sắp xếp chèn với tìm kiếm nhị phân

ý tưởng được bắt đầu như sau, cho 1 danh sách chưa sắp xếp hãy tìm 1 phần tử x bất kỳ nào đó trong danh sách, rõ ràng để tìm ta phải lần lượt xét từng phần tử cho tới khi nào bắt gặp phần tử cần tìm, nếu danh sách lớn thì thời gian tìm rất lâu. Bây giờ với một danh sách đã sắp xếp, chia đôi danh sách và lấy phần tử là t ở vị trí chia đôi để so sánh. Nếu t = x thì dừng, nếu t < x vì danh sách đã sắp xếp nên x chỉ có thể nằm bên nửa phải danh sách nên ta chỉ việc tìm kiếm trong 1 nửa danh sách bên phải và giảm đi khá nhiều công việc tìm kiếm. Nếu x < t thì tương tự, ta chỉ việc tìm bên nửa trái, đối với việc tìm kiếm cho lần sau với các danh sách con nửa trái hoặc nửa phải ta thực hiện tương tự như vậy một cách đệ quy.

a) Từ những ý tưởng thuật toán ta xây dựng cây nhị phân tìm kiếm cho một danh sách như sau:

- Chọn 1 phần tử bất kỳ làm gốc

- Tất cả các phần tử có giá trị Ê gốc thì thuộc cây con trái - Tất cả các phần tử có giá trị > gốc thì thuộc cây con phải - Đối với các cây con thì cũng có tính chất tương tự như vậy

Ví dụ cây nhị phân tìm kiếm cho danh sách 12, 10, 6, 11, 15, 13, 16, 19, 18 như hình 1.6: Hình 1.6 b) Sắp xếp chèn bằng việc tìm nhị phân vị trí đúng. 12 15 18 10 6 11 13 16 19

Có thể tạm gọi là phương pháp sắp xếp chèn nhị phân. ý tưởng như sau: cho trước một danh sách đã sắp xếp A, cần chèn 1 phần tử mới x vào A sao cho danh sách luôn được sắp xếp. Đầu tiên ta tìm vị trí đúng của x trong A sau đó chèn x vào đúng vị trí này trong A, ta có danh sách A = A ẩ {x} luôn được sắp xếp. Để tìm được ví trí đúng cần chèn của x trong A ta sử dụng phương pháp tìm kiếm nhị phân, chèn theo cách này gọi là chèn nhị phân.

Ví dụ để sắp xếp B = x1, x2, x3, ... xn ta thực hiện như sau: A := f;

For i:=1 to n do Begin

- Tìm vị trí đúng của xi trong A theo phương pháp tìm nhị phân - Chèn xi vào A theo đúng vị trí vừa tìm được (A := A ẩ {xi}) End;

Kết quả A là danh sách sắp xếp của B.

Chương trình Pascal sau sắp xếp tăng dần theo phương pháp chèn nhị phân

Const n = 9;

Ds : Array[1..n] of Integer = (1,9,1,6,3,10,10,8,7); {Ham tra lai vi tri dung cua Pt trong danh sach} Function FindNp(l,r,Pt: Integer): Integer;

Var t: Integer; Begin

If Pt<=Ds[l] then FindNp:=l

Else If Pt>=Ds[r] then FindNp:= r + 1 Else Begin

Repeat

t:= (l + r) div 2;

If Pt = ds[t] then Begin FindNp:=t+1; Exit End Else If Pt<ds[t] then r:=t Else l:=t; Until r=l+1; FindNp:=l+1; End; End; Var i, j, vt, s: Integer;

Begin

For i:=2 to n do Begin vt:= FindNp(1,i-1,ds[i]);

{Chen dung vi tri sao cho ds luon duoc sap xep} s:=ds[i];

For j:=i-1 Downto vt do ds[j+1]:=ds[j]; ds[vt]:=s;

End;

For i:=1 to n do Write(ds[i]:3); 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 63 - 65)