<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
Ch
ươ
ng 4: Gi
ả
i thu
ậ
t s
ắ
p x
ế
p và
tìm ki
ế
m
đơ
n gi
ả
n
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. Tìm ki
ế
m tu
ầ
n t
ự
(Sequence Search)
Ngơ Cơng Thắng Bài giảng CTDL> - Chương 04 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 toá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 khoá 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 04 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
{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
{Đổi chỗ phần tử nhỏ nhất k cho phần tử 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.2.
Đ
ánh giá gi
ả
i thu
ậ
t
Ngô Công Thắng Bài giảng CTDL> - Chương 04
•
V
ớ
i gi
ả
i thu
ậ
t trình bày
ở
trên thì phép tốn tích c
ự
c
là phép so sánh (a[j]<a[k]).
•
G
ọ
i C là s
ố
l
ượ
ng phép so sánh, C
đượ
c tính nh
ư
sau:
Ở
l
ượ
t th
ứ
i (i=1, 2,… , n-1),
để
tìm khố nh
ỏ
nh
ấ
t
c
ầ
n n-i phép so sánh. S
ố
l
ượ
ng phép so sánh này
không ph
ụ
thu
ộ
c vào tình tr
ạ
ng ban
đầ
u c
ủ
a dãy
khố. Do
đ
ó ta có:
•
V
ậ
y,
độ
ph
ứ
c t
ạ
p tính tốn là O(n
2
)
6.5
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
</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>
2.1. Ph
ươ
ng pháp
•
Ví d
ụ
: Cho dãy khố 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
i=5 1, 4, 6, 7, 10
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.7
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; {chèn tg vào sau a[j]}
End;
</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>
2.2.
Đ
ánh giá thu
ậ
t tốn
•
Phép tốn tích c
ự
c trong thu
ậ
t toá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
sánh. Do v
ậ
y
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.9
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ị khố đề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à:
</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>
3. S
ắ
p x
ế
p n
ổ
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 từng cặp khóa liền kề, gối nhau từ phải qua trái,
nếu khóa đứng sau nhỏ hơn khóa đứng trước thì đổi chỗ.
Loạt so sánh thứ nhất thì khóa nhỏ nhất của dãy được đẩy
lên vị trí đầu tiên (gọi là phần tử được sắp).
– Tiếp tục so sánh và đổi chỗ các phần tử liền kề gối nhau của
dãy chưa sắp, lần thứ 2 ta được số nhỏ nhất của dãy chưa
sắp được đưa lên đầu dãy chưa sắp(ví trí 2).
– Cứ tiếp tục làm tương tự như trên cho đến khi dãy chỉ cịn
1 phần tử.
Ngơ Cơng Thắng Bài giảng CTDL> - Chương 04 6.11
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
</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>
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
a[j] <-> a[j-1];
Return
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.13
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>
</div>
<!--links-->