Ý TƯỞNG THUẬT TOÁN.• Giả sử ta có n số cần sắp xếp khi đó: • So sánh hai số liên tiếp: Nếu đúng thứ tự thì để nguyên.. Nhược điểm là nếu dãy đã được sắp xếp thì ta... VUN ĐỐNG Ta cần
Trang 2SẮP XẾP KIỂU ĐỔI CHỖ (EXCHANGE SORT)
Giải thuật
Ví dụ
Ý Tưởng 1
Viết chương trình
3 4 5
Trang 3I Ý TƯỞNG THUẬT TOÁN.
• Giả sử ta có n số cần sắp xếp khi đó:
• So sánh hai số liên tiếp:
Nếu đúng thứ tự thì để nguyên.
Nếu ngược thì thứ tự đổi chỗ.
• Sau vòng 1 thì số bé nhất nổi lên ở vị trí 1.
• Sau vòng 2 thì số bé nhất trong n-1 số còn lại nổi
Trang 49 2 15 1
1
2 3 4 5 6 7 8
Trang 51 2 3 4 5 6 7 8
7 3 9 2 15 1
10 5 i
Trang 61 2 3 4 5 6 7 8
7 3 9 2 15
1 10 5
Trang 71 2 3 4 5 6 7 8
7 3 9 2
15
1
10 5 i
Trang 81 2 3 4 5 6 7 8
7 3
9 2
15
1
10 5 i
Trang 91 2 3 4 5 6 7 8
7 3
9 2
15
1
10
5 i
Trang 101 2 3 4 5 6 7 8
7 3
9 2
15
1
10
5 i
Trang 111 2 3 4 5 6 7 8
7 3
9 2
Trang 121 2 3 4 5 6 7 8
7 3
9 2
Trang 13III GIảI THUậT
Bước 1:
Cho i chạy từ 1 tới n-1 (For i:=1 to n-1 do)
Cho j chạy từ n xuống i+1 (For j:=n downto i+1 do )
Bước 2: Trong khi (j > i) thực hiện so sánh
Nếu a[j]<a[j-1] thì hoán vị a[j] và a[j-1]
Tiếp tục với j = j-1;
Bước 3:
i = i+1;
Nếu i >N-1 (Hết dãy) Dừng Nếu ngược lại: Lặp lại Bước 2
Trang 14IV ĐÁNH GIÁ ĐỘ PHỨC TẠP
Trong mọi trường hợp thì số phép so sánh là:
(n-1)+(n-2)+…+2+1=n*(n-1)/2
Vì vậy độ phức tạp của thuật toán là O(n 2 ).
Nhược điểm là nếu dãy đã được sắp xếp thì ta
Trang 15PHƯƠNG PHÁP VUN ĐỐNG
HEAP SORT
Ví Dụ Giải Thuật
Ý Tưởng Thuật Toán Đống Và Vun Đống
Trang 16I ĐỊNH NGHĨA ĐỐNG
Đống là một cây nhị phân hoàn chỉnh mà mọi nút cha
đều có trường khóa lớn hơn khóa của hai nút con.Ví dụ
cây sau đây là một đống:
6
5 2
3
8 7
9
Trang 17II VUN ĐỐNG
Ta cần sắp xếp lại dãy số đã cho để nó biểu diễn một
đống Ta có một số nhận xét sau:
Nếu cây nhị phân hoàn chỉnh đã là đống thì các cây con
của các nút(nếu có)cũng là cây nhị phân hoàn chỉnh và
cũng là đống.
Trên cây nhị phân hoàn chỉnh có n nút thì chỉ có[n/2] nút
cha.
Một nút lá bao giờ cũng có thể coi là đống
Để vun một nhánh cây gốc r thành đống,ta có thể coi hai
nhánh con của nó là(nhánh gốc 2r và 2r+1)đã là đống
rồi Thuật toán vun đống sẽ được thực hiện từ dưới lên
đối với cây.Gọi h là chiều cao của cây,nút ở mức h(nút
lá) đã là gốc một đống,ta vun lên để những nút ở mức
h-1 cũng là gốc của đống,…cứ như vậy cho tới nút ở mức
Trang 18III THUẬT TOÁN VUN ĐỐNG
Gỉa sử:ta có gốc r và hai nút con là 2r và 2r+1 đã
Trang 20V Ý TƯỞNG THUẬT TOÁN
của đống là khóa lớn nhất, ta đảo giá trị khóa đó
đống nữa nhưng nó lại biểu diễn cây nhị phân
hoàn chỉnh mà hai nhánh cây ở nút thứ 2 và nút
thứ 3 đã là đống rồi Vì vậy ta chỉ cần vun một
và tiếp tục cho tới khi đống chỉ còn lại một nút
Trang 212 16
1
Trang 22VÍ DỤ
Ta thực hiện vun từ dưới lên:
Điều chỉnh cây gốc i=n div 2=3.
Trang 23VÍ DỤ
Điều chỉnh cây gốc i=2.
Điều chỉnh cây gốc i=1.
1
Trang 247 10
1
Trang 257 10
1
Trang 267 2
1
Trang 277 8
1
Trang 294
Trang 304
Trang 311
Trang 321
Trang 34VÍ DỤ
Sắp xếp:đổi chỗ a[1] cho a[2].Ta được dãy sắp xếp là:
A=6,7,8,10,16
Sau khi đổi chỗ thì cây chỉ còn một nút.Khi đó các khóa đã
được sắp xếp vào đúng vị trí của nó trong săos xếp.
Trang 35VII GIẢI THUẬT
Bước 1: Tạo đống ban đầu
For i:=[n/2] downto 1 do
Call adjust ( i ,n )
Bước 2: Ta so sánh hai nút con để tìm con lớn hơn.
So sánh gốc với con lớn:
Nếu gốc lớn hơn con thì cây nhị phân đã được vun đống.
Nếu For i:=n-1 downto 1 do
Trang 36VIII ĐÁNH GIÁ.
Thuật toán gồm hai bước:
Bước 1:Vun cây ban đầu thành đống.
Bước 2:Sắp xếp.
Cây nhị phân hoàn chỉnh n nút thì chiều cao của
nó không quá [log 2 (n+1)]+1.Độ phức tạp trung
bình của thuật toán là O(nlog 2 n).