0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
1
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
SẮP XẾP KIỂU ĐỔI CHỖ
(EXCHANGE SORT)
Giải thuật
Ví dụ
Ý Tưởng
1
Viết chương trình
SẮP XẾP
SẮP XẾP
2
3
4
5
Đánh giá độ phức tạp
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
2
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
I. Ý 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
lên ở vị trí 2.
•
………………………………………………
•
Sau vòng n-1 thì số bé nhất trong 2 số còn lại sẽ
nổi lên ở vị trí n-1.
•
Như vậy ta kết thúc công việc sắp xếp
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
3
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
II. VÍ DỤ
Sắp xếp dãy số sau:
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
4
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
10
5
7
3
9
2
15
1
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
5
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
6
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
7
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
8
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
9
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
10
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
11
7
3
9
2
15
1
10
5
i
j
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
1
2
3
4
5
6
7
8
12
7
3
9
2
15
1
10
5
i
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
III. 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.
Bước 4: Kết thúc
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
13
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
IV. ĐÁ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
vẫn phải so sánh đủ số lần lặp.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
14
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
PHƯƠNG PHÁP VUN ĐỐNG
HEAP SORT
Ví Dụ
Giải Thuật
Ý Tưởng Thuật Toán
Đống Và Vun Đống
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
15
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
I. ĐỊ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:
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
16
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
10
1
4
6
523
87
9
II. 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
1 cũng là gốc của đống.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
17
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
III. THUẬT TOÁN VUN ĐỐNG
Gỉa sử:ta có gốc r và hai nút con là 2r và 2r+1 đã
là đống rồi:
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â đã
được vun đống.
Nếu gốc bé hơn con thì ta đẩy con lên.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
18
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
IV. VÍ DỤ VUN ĐỐNG
Vun đống cây sau:
Ta thấy gốc 2 và gốc 3 đã là đống rồi.
Gốc 1 chưa là đống nên ta cần vun gốc 1 thành đống.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
19
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
16
40
8
26
10
1
2 3
4
5 6
V. Ý TƯỞNG THUẬT TOÁN
Dãy khóa k
1
,k
2
,…,k
n
được vun từ dưới lên để nó
biểu diễn một đống, k
1
tương ứng với nút gốc
của đống là khóa lớn nhất, ta đảo giá trị khóa đó
cho k
n
và không tính tới k
n
nữa.
Dãy khóa còn lại tuy không còn biểu diễn củ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
lần,ta lại được một đống,ta đảo giá trị k
1
cho k
n-1
và tiếp tục cho tới khi đống chỉ còn lại một nút
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
20
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
VI. VÍ DỤ SẮP XẾP VUN ĐỐNG
Ví dụ ta có dãy số sau:
Ta có biểu diễn cây của dãy số trên như sau:
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
21
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
16 10 2 6 8 7
10
78
6
2
16
1
2
3
4 5
6
VÍ 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.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
22
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
10
16 2
8
7
6
1
2
3
4 5
6
VÍ DỤ
Điều chỉnh cây gốc i=2.
Điều chỉnh cây gốc i=1.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
23
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
10
2
16 7
86
1
2 3
4 5 6
VÍ DỤ
Ta bắt đầu sắp xếp:
Đổi chỗ a[1] cho a[6].ta được dãy sắp xếp là
A=16.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
24
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
16
2
86
710
1
2
3
4
5
6
VÍ DỤ
Vun đống cây gốc i=1.
0
6
/
1
8
/
1
4
1
2
:
2
8
P
M
25
S
ắ
p
x
ế
p
k
i
ể
u
đ
ổ
i
c
h
ỗ
v
à
k
i
ể
u
v
u
n
đ
ố
n
g
2
86
7
10
1
2 3
4 5