<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
Ch
ươ
ng 6: Gi
ả
i thu
ậ
t s
ắ
p x
ế
p
1. S
ắ
p x
ế
p ch
ọ
n (Selection Sort)
2. S
ắ
p x
ế
p chèn (Insert Sort)
3. S
ắ
p x
ế
p n
ổ
i b
ọ
t (Bubble Sort)
4. S
ắ
p x
ế
p nhanh (Quick Sort)
5. S
ắ
p x
ế
p vun
đố
ng (Heap Sort)
6. S
ắ
p x
ế
p hòa nh
ậ
p (Merge Sort)
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.1
1. S
ắ
p x
ế
p ch
ọ
n (Selection Sort)
1.1. Ph
ươ
ng pháp
• Gi
ả
s
ử
c
ầ
n
s
ắ
p x
ế
p
t
ă
ng d
ầ
n
m
ộ
t dãy khố
a
<sub>1</sub>
, a
<sub>2</sub>
,..., a
<sub>n</sub>
.
•
Ý t
ưở
ng c
ủ
a thu
ậ
t tốn
nh
ư
sau
:
– Ch
ọ
n ph
ầ
n t
ử
có khố nh
ỏ
nh
ấ
t .
–
Đổ
i ch
ỗ
nó v
ớ
i ph
ầ
n t
ử
a
<sub>1</sub>
.
</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>
1.1. Ph
ươ
ng pháp (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
•
Ví d
ụ
:
Cho dãy khố ban
đầ
u là: 6, 10, 1, 8, 9
v
ớ
i n=5.
i=1 1, 10, 6, 8, 9
i=2 1, 6, 10, 8, 9
i=3 1, 6, 8, 10, 9
i=4 1, 6, 8, 9, 10
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.3
1.1. Ph
ươ
ng pháp (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
Procedure selectionSort(a,n);
For i:= 1 to n-1 Do
Begin
1) {Tìm phần tửnhỏnhất ở vịtrí k }
+) k:=i;
+) For j:=i+1 To n Do
If a[j] < a[k] then k:=j
2) {Đổi chỗ phần tử nhỏ nhất ở vị trí k cho vịtrí i}
If k ≠ i then a[k]↔a[i];
</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>
2. S
ắ
p x
ế
p chèn (Insert Sort)
2.1. Ph
ươ
ng pháp
•
Ph
ươ
ng pháp này
đượ
c nh
ữ
ng ng
ườ
i ch
ơ
i bài hay
dùng.
•
Gi
ả
s
ử
c
ầ
n s
ắ
p x
ế
p t
ă
ng d
ầ
n dãy khoá a
<sub>1</sub>
, a
<sub>2</sub>
,..., a
<sub>n</sub>
. Ý
t
ưở
ng thu
ậ
t toán nh
ư
sau:
– Các phần tửđược chia thành dãy đích: a<sub>1</sub>,..., a<sub>i-1</sub> (kết quả)
và dãy nguồn a<sub>i</sub>,..., a<sub>n</sub>.
– Bắt đầu với i=2, ở mỗi bước phần tử thứ i của dãy nguồn
được lấy ra và chèn vào vị trí thích hợp trong dãy đích sao
cho dãy đích vẫn tăng dần. Sau đó i tăng lên 1 và lặp lại.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.5
2.1. Ph
ươ
ng pháp
•
Ví d
ụ
: Cho dãy khoá 6, 10, 1, 7, 4 v
ớ
i n=5 (dãy
s
ố
có 5 ph
ầ
n t
ử
).
Dãy
đ
ích
Dãy ngu
ồ
n
6
10, 1, 7, 4
i=2 6, 10
1, 7, 4
i=3 1, 6, 10
7, 4
i=4 1, 6, 7, 10
4
</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>
Th
ủ
t
ụ
c chèn
Procedure insertSort(a,n)
1) a[0]:=-∞
2) For i:=2 to n Do
Begin
tg:=a[i]; j:=i-1;
While tg<a[j] Do
Begin
a[j+1]:=a[j]; j:=j-1;
End;
a[j+1]:=tg; {đưa tg vào đúng vi trí, chèn vào sau j}
End;
Return
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.7
2.2.
Đ
ánh giá thu
ậ
t tốn
•
Phép tốn tích c
ự
c trong thu
ậ
t tốn này là
phép so sánh (tg<a[j]). S
ố
phép toán so sánh C
đượ
c tính nh
ư
sau:
–
Tr
ườ
ng h
ợ
p thu
ậ
n l
ợ
i nh
ấ
t là dãy khoá a
<sub>1</sub>
, a
<sub>2</sub>
,..., a
<sub>n</sub>
đ
ã
đượ
c s
ắ
p, nh
ư
v
ậ
y m
ỗ
i l
ầ
n ch
ỉ
c
ầ
n 1 phép so
</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>
2.2.
Đ
ánh giá thu
ậ
t tốn
• Trường hợp xấu nhất nếu dãy khoá sắp theo thứ tự ngược với
thứ tự sắp xếp thì ở lượt i cần có: C= (i-1) phép so sánh. Do
vậy
• Trường hợp trung bình: Giả sử mọi giá trị khoá đều xuất hiện
đồng khả năng thì trung bình phép so sánh ở lượt thứ i là C<sub>i</sub>=
i/2, do đó số phép so sánh trung bình của giải thuật này là:
• O(n2)
Ngơ Cơng Thắng Bài giàng CTDL> - Chương 06 6.9
3. S
ắ
p x
ế
p s
ủ
i b
ọ
t (Bubble Sort)
3.1. Ph
ươ
ng pháp
•
Gi
ả
s
ử
c
ầ
n s
ắ
p x
ế
p t
ă
ng d
ầ
n dãy khoá a
<sub>1</sub>
, a
<sub>2</sub>
,..., a
<sub>n</sub>
. Ý
t
ưở
ng thu
ậ
t toán nh
ư
sau:
– So sánh các cặp phần tử liền kềgối nhau từ phải qua
trái,nếu phần tử đứng sau nhỏ hơn đứng trước thì đổi
chỗ. Kết quả lần thứ nhất phần tử nhỏ nhất của dãy
được đẩy lên vị trí 1 (gọi là phần tử được sắp).
– Tiếp tục đổi chỗ các phần tử liền kề của dãy chưa
sắp, lần thứ 2 ta được phần tử nhỏ nhất của dãy được
đưa về vị trí 2.
</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>
3.1. Ph
ươ
ng pháp (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
•
Ví
d
ụ
: Cho dãy khố ban
đầ
u là: 6, 3, 7,
10, 1, 8 v
ớ
i n=6.
6, 3, 7, 10, 1, 8
i=1 1, 6, 3, 7, 10, 8
i=2 1, 3, 6, 7, 8, 10
i=3 1, 3, 6, 7, 8, 10
i=4 1, 3, 6, 7, 8, 10
i=5 1, 3, 6, 7, 8, 10
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.11
Th
ủ
t
ụ
c s
ắ
p x
ế
p n
ổ
i b
ọ
t
Procedure bubbleSort(a,n)
For i:= 1 to n-1 Do
For j:= n downto i+1 Do
If a[j]<a[j-1] then
</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>
3.2.
Đ
ánh giá thu
ậ
t tốn
•
Gi
ả
i thu
ậ
t này t
ươ
ng t
ự
nh
ư
gi
ả
i thu
ậ
t s
ắ
p x
ế
p b
ằ
ng
cách ch
ọ
n tr
ự
c ti
ế
p (m
ụ
c 1), do
đ
ó có:
•
Nh
ậ
n xét: V
ớ
i 3 ph
ươ
ng pháp s
ắ
p x
ế
p trên, n
ế
u n
v
ừ
a và nh
ỏ
thì ph
ươ
ng pháp chèn tr
ự
c ti
ế
p (insert
sort) t
ỏ
ra t
ố
t h
ơ
n, n
ế
u v
ớ
i n l
ớ
n thì c
ả
3 ph
ươ
ng
pháp
đề
u có c
ấ
p O(n
2
<sub>), </sub>
<sub>đ</sub>
<sub>ây là m</sub>
<sub>ộ</sub>
<sub>t chi phí th</sub>
<sub>ờ</sub>
<sub>i gian </sub>
khá cao.
Ngơ Cơng Thắng Bài giàng CTDL> - Chương 06 6.13
4. S
ắ
p x
ế
p nhanh (Quick Sort)
4.1. Ph
ươ
ng pháp
• S
ắ
p
x
ế
p
nhanh
(quick sort) còn
đượ
c
s
ắ
p
x
ế
p phân
đ
o
ạ
n (partition sort
)
.
•
Ý t
ưở
ng thu
ậ
t tốn:
– Chọn ngẫu nhiên một phần tử x.
– Duyệt từ bên trái mảng cho tới khi có một phần tử
a<sub>i</sub>>=x
– Sau đó duyệt từ bên phải mảng cho tới khi có một
phần tử aj=<x
– Đổi chỗ a<sub>i</sub> và a<sub>j</sub>
</div>
<!--links-->