1
TÌM KIẾM & SẮP XẾP
Bài giảng Cấu trúc dữ liệu và Giải thuật
Nội d
dung
Tì kiếm
Tìm
kiế
Tuần tự
Nhị phân
Sắp xếp
Bubble sort
Selection sort
Insert sort
Quick sort
Tìm kiếm
3
Tìm kiếm: duyệt một danh sách và lấy ra phần tử
thoả tiêu chuẩn cho trước.
Là thao tác phổ biến trên máy tính:
Tìm
mẫu tin trong cơ sở dữ liệu
Tìm kiếm thơng tin trên Internet…
Khảo sát việc tìm kiếm trên mảng/danh sách.
4
Tìm kiếm
Giải thuật
Input:
put:
Mảng A gồm
n phần tử
Giá trị x cần tìm
Trả về:
Vị
trí phần tử x trong A hoặc –1 nếu x không xuất hiện
Thao tác cơ bản:
So
sánh
5
Tìm kiếm tuần tự
Giải thuật
Giải thuật:
Lần lượt so sánh x với các phần tử của mảng A cho đến khi
gặp được phần tử cần tìm, hoặc hết mảng.
Ví dụ: A = {1, 25, 6, 5, 2, 37, 40}, x = 6
x = 6
1
25
6
5
2
37
40
6
5
2
37
40
2
37
40
x = 6
1
25
x = 6
1
25
6
5
Dừng
6
Tìm kiếm tuần tự
Đánh giá
Đánh giá (thao tác so sánh):
Tốt
nhất: O(1)
Xấu nhất: O(n)
Trung bình:
Giả
Hiếm khi xảy ra. Tại sao?
sử dữ liệu phân bố đều, xác suất bắt gặp x tại mỗi vị trí
đều như nhau.
Mỗi vòng lặp thực hiện 2 thao tác so sánh. Tại sao?
Số thao tác = 2*(1 + 2 + … + n) = n + 1
Độ phức tạp: O(n)
7
Tìm kiếm tuần tự
Phần tử lính canh
Mỗi vịng lặp cần 2 thao tác so sánh:
Kiểm
tra hết mảng
Kiểm tra phần tử hiện tại có bằng x
Phần tử lính canh: đặt giá trị x vào cuối mảng ⇒
không cần kiểm tra điều kiện hết mảng.
Ví dụ: A = {1, 25, 5, 2, 37}, x = 6
1
25 5
2
37 6
Trả về:
ề: n nếu
nế khơng tìm thấ
thấy
Tìm kiếm nhịị phân
p
8
Khi mảng gồm các phần tử được sắp,
sắp tận dụng điều
kiện này để giảm số thao tác.
Ý tưởng:
Xét
phần tử giữa A[m]
Nếu A[m] = x, trả về m
Nếu A[m] > x,
x tìm trong các phần tử bên trái của m
Nếu A[m] < x, tìm trong các phần tử bên trái của m
9
Tìm kiếm nhị phân
Ví dụ minh hoạ
A = {2,
{2 3,
3 6,
6 7,
7 10
10, 16,
16 18},
18} x = 16
2
[0]
3
6
7
10 16
18
[1] [2] [3] [4] [5]
[6]
[4]
2
3
6
7
[5] [6]
10 16
18
Tìm kiếm nhị phân
Chương trình
10
int BinarySearch(int a[], int n, int x)
{
int l = 0, r = n-1;
while (
(l <= r)
) {
int m = (l + r)/2;
if (a[m]==x) return m;
// tìm thấy
else if (x < a[m]) r = m – 1;
else l = m + 1;
}
return –1;
1
// khơ
khơng tìm
ì thấy
hấ
}
11
Tìm kiếm nhị phân
Bài tập
Thực hiện việc tìm kiếm đối với các bài tập sau:
A=
{1, 2, 6, 26, 28, 37, 40}, x = 40
A=
{1, 2, 6, 26, 28, 37, 40}, x = -7
12
Tìm kiếm nhị phân
Đánh giá
Mỗi lần lặp
lặp, chiều dài mảng con phải xét được
giảm ½ so với mảng trước đó.
Mảng ban đầu được chia tối đa k lần với k =
⎣log2n⎦.
Tối đa k vịng lặp được thực hiện trong đó mỗi
vòng lặp thực hiện 1-2 phép so sánh.
Độ phức tạp: O(log2n)
Mảng cần được sắp xếp trước!!!
Sắp
p xếp
p
13
Sắp xếp: tổ chức các phần tử trong một danh sách
theo thứ tự.
Là bài toán phổ biến trên máy tính.
Nhiều giải thuật sắp xếp đã ra đời.
đời
Khảo sát
Khả
át vàà đánh
đá h giá
iá hiệu
hiệ quảả một
ột số
ố giải
iải thuật
th ật sắp
ắ
xếp thông dụng dựa trên mảng.
14
Sắp xếp
Giải thuật
Input:
Mảng A gồm
n phần tử.
Output:
hoán vị của A sao cho: A0 ≤ A1 ≤ … ≤ An-1 (sắp
xếp
p tăngg dần).
)
Một
Thao tác cơ bản:
So
sánh
Hoán vị (đổi vị trí hai phần tử)
15
Sắp xếp
Các giải thuật
Các phương pháp sắp xếp thông dụng:
Bubble
Sort
Selection Sort
Insertion Sort
Q
Quick Sort
Merge Sort
Shell Sort
Heap Sort
Radix Sort
Bubble sort
16
Giải thuật:
Xuất
phát từ cuối (đầu) dãy, đổi chỗ các cặp phần tử kế
cận để đưa p
phần tử nhỏ hơn về vị trí đúng
g đầu dãyy
hiện hành.
Sau đó khơng xét đến nó ở bước kế tiếp.
Lần xử lý thứ i sẽ có vị trí đầu dãy là i.
Lặp lại cho đến khi khơng cịn cặp phần tử nào để xét.
Ví dụ: sắp xếp dãy A: 15 2 8 7 3 6 9 17
17
Bubble sort
Ví dụ
i=0
j=4
15
2
8
7
3
6
9
17
i=0
j=3
15
2
8
3
7
6
9
17
i=0
j=1
15
2
3
8
7
6
9
17
i=1
j=5
2
15
3
8
7
6
9
17
i=1
j=4
2
15
3
8
6
7
9
17
i=1
j=2
2
15
3
6
8
7
9
17
i=2
j=5
2
3
15
6
8
7
9
17
i=2
j=3
2
3
15
6
7
8
9
17
18
Bubble sort
Ví dụ (tt)
i=3 j=4
2
3
6
15
7
8
9
17
i=4 j=5
2
3
6
7
15
8
9
17
i=5 j=6
2
3
6
7
8
15
9
17
i=6 j=7
2
3
6
7
8
9
15
17
2
3
6
7
8
9
15
17
19
Bubble sort
Chương trình
void BubbleSort(int a[], int n){
for(int i=0; i
for(int j = n-1; j>i; j--){
if( [j]< [j 1])// ế sai
if(a[j]
i vị
ị trí
t í thì đổi chỗ
hỗ
HoanVi(a[j],a[j-1]);
}
}
}
20
Bubble sort
Bài tập
Mơ tả tình trạng dãy A sau mỗi bước chạy với thuật
toán Bubble sort.
A = {2,
{2 9,
9 5,
5 12,
12 20,
20 15
15, -8
8, 10}
21
Bubble sort
Đánh giá
Các giải thuật sắp xếp thường có độ phức tạp tương
tự nhau.
Cần một đánh giá chi tiết:
Các
trường hợp: xấu nhất, tốt nhất, trung bình
Các thao tác:
So
sánh
Gán (quan trọng hơn vì tốn nhiều chi phí hơn). Lưu ý: mỗi
thao tác gán vị tốn
ố 3 phép gán
22
Bubble sort
Chương trình
void BubbleSort(int a[], int n){
for(int i=0; i
for(int j = n-1; j>i; j--){
if( [j]< [j 1])
if(a[j]
HoanVi(a[j],a[j-1]);
}
}
}
Số lần vòng i
thực hiện?
Số lần vòng j
thực
ự hiện?
ệ
23
Bubble sort
Đánh giá
Số phép so sánh: không phụ thuộc vào tình trạng
dãy số ban đầu.
n(n − 1)
(n − i − 1) =
∑
2
i =0
n−2
Số lượng phép gán: tùy vào kết quả so sánh
Tốt
nhất: 0 n − 2
3n(n − 1)
Xấu nhất: ∑ 3( n − i − 1) =
2
i= 0
24
Shaker sort
Cải tiến Bubble sort
Nhận xét: Bubble sort có các khuyết điểm:
Khơng
nhận diện được tình trạng dãy đã có thứ tự hay
khơng
g có thứ tự từng
g phần.
p
Trong khi phần tử nhỏ được đưa về vị trí đúng rất
nhanh, thì các phần tử lớn lại được đưa về vị trí đúng
rất
ấ chậm.
h
Giải thuật Shaker sort cải tiến các khuyết điểm này.
25
Shaker sort
Cải tiến Bubble sort
Cải tiến:
Duyệt
mảng theo 2 lượt từ 2 phía khác nhau:
Lượt
ợ
đi: đẩy
y phần
p
tử nhỏ về đầu mảng
g
Lượt về: đẩy phần tử lớn về cuối mảng.
Ghi
nhận lại những đoạn đã sắp.