Bài giảng Cấu trúc dữ liệu và giải thuật: Tìm kiếm và sắp xếp - Đậu Ngọc Hà Dương có nội dung trình bày về tìm kiếm tuần tự và tìm kiếm nhị phân; sắp xếp bubble sort, selection sort, insert sort, quick sort,... Mời các bạn cùng tham khảo!
Trang 1TÌM KIẾM & SẮP XẾP
Bài giảng Cấu trúc dữ liệu và Giải thuật
Trang 3Tìm kiếm
3
Tìm kiếm: duyệt một danh sách và lấy ra phần tử
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:
Khảo sát việc tìm kiếm trên mảng/danh sách
Trang 6 Giả 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
Số thao tác = 2*(1 + 2 + … + n) = n + 1
Độ phức tạp: O(n)
Trang 7Phầ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
Trang 8Tìm kiếm nhị phân ị p
8
Khi mảng gồm các phần tử được sắp tận dụng điều
Khi mảng gồm các phần tử được sắp, tận dụng điều kiện này để giảm số thao tác
Ý tưởng:
Trang 10}
Trang 12Tìm kiếm nhị phân
Đánh giá
12
Mỗi lần lặp chiều dài mảng con phải xét được
Mỗi lần 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 =
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
Tối đa k vòng lặp được thực hiện trong đó mỗi
Trang 13Là 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
Nhiều giải thuật sắp xếp đã ra đời
Khảo sát và đánh giá hiệu quả một số giải thuật sắp xếp thông dụng dựa trên mảng
Trang 15Sắp xếp
Các giải thuật
15
Các phương pháp sắp xếp thông dụng: Các phương pháp sắp xếp thông dụng:
Trang 16Bubble sort
16
Giải thuật:
Giải thuật:
cận để đưa phần tử nhỏ hơn về vị trí đúng đầu dãy p g y hiện hành.
Lần xử lý thứ i sẽ có vị trí đầu dãy là i.
Ví dụ: sắp xếp dãy A: 15 2 8 7 3 6 9 17
Trang 19Bubble sort
Chương trình
19
void BubbleSort(int a[], int n){
for(int i=0; i<n-1 ; i++){
}
Trang 20Bubble sort
Bài tập
20
Mô tả tình trạng dãy A sau mỗi bước chạy với thuật
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 9 5 12 20 15 -8 10}
Trang 21Bubble sort
Đánh giá
21
Các giải thuật sắp xếp thường có độ phức tạp tương
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ần một đánh giá chi tiết:
Trang 22Bubble sort
Chương trình
22
void BubbleSort(int a[], int n){
for(int i=0; i<n-1 ; i++){
for(int j = n-1; j>i; j ){
if( [j]< [j 1])
HoanVi(a[j],a[j-1]);
} }
thực hiện?
thực hiện?
Trang 23Bubble sort
Đánh giá
23
Số phép so sánh: không phụ thuộc vào tình trạng
Số phép so sánh: không phụ thuộc vào tình trạng dãy số ban đầu
Trang 24Shaker sort
Cải tiến Bubble sort
24
Nhận xét: Bubble sort có các khuyết điểm:
Nhận xét: Bubble sort có các khuyết điểm:
không có thứ tự từng phần g g p
nhanh, thì các phần tử lớn lại được đưa về vị trí đúng
ấ h rất chậm.
Giải thuật Shaker sort cải tiến các khuyết điểm này.
Trang 25 Lượt đi: đẩy phần tử nhỏ về đầu mảng ợ y p g
Lượt về: đẩy phần tử lớn về cuối mảng.
Trang 28{ if( [j]< [j 1]) { if(a[j]<a[j-1])
l=k; //loại các phần tử đã có thứ tự ở đầu dãy
Trang 29Shaker sort
Chương trình (tt)
29
j=l; //đẩy phần tử lớn về cuối while(j<r)
} r=k; //loại các phần tử đã có thứ tự ở cuối dãy }
Trang 30Selection Sort
30
Mô phỏng cách sắp xếp tự nhiên nhất trong thực tế
Mô phỏng cách sắp xếp tự nhiên nhất trong thực tế
hiện hành.
Trang 31Selection Sort
Giải thuật
31
Các bước của giải thuật:
Các bước của giải thuật:
1 i = 0.
2 Tìm a[min] nhỏ nhất trong dãy từ a[i] đến a[n-1] [ ] g y [ ] [ ]
3 Hoán vị a[min] và a[i]
4 Nếu i ≤ n thì tăng i và lặp lại bước 2
Ngược lại: Dừng thuật toán
Trang 33Selection Sort
Chương trình
33
void SelectionSort(int a[], int n){
int min; //chỉ số của phần tử nhỏ nhất
for(int i=0; i<n-1; i++)
{
min = i;
for(int j = i+1; j<n; j++) {
Trang 34min = i;
for(int j = i+1; j<n; j++) {
if(a[j] < a[min])
min = j;
} HoanVi(a[min], a[i]);
}
ố
} Nhận xét số phép so
sánh trong vòng for
Trang 35( )
1 (
n
i
n
n i
( )
1 4
(
i n
∑
i
Trang 36Insertion Sort
36
Cách xếp các quân bài dùng thuật toán Insertion Các ếp các quâ bà dù g t uật toá se t o
Sort:
quân bài mới lên thì tìm vị trí đúng của nó và chèn vào
bài trong dãy ban đầu.
Trang 37 Thêm vào a1 sẽ có a0, a1 được sắp, tiếp tục thêm a2, a3
Trang 39Insertion Sort
Giải thuật
39
Các bước của giải thuật:
Các bước của giải thuật:
Trang 40int x = a[i], pos = i-1;
while(pos>=0 && a[pos] > x) //tìm pos {
a[pos+1]=a[pos]; //dời về sau 1 vị trí pos ;
} a[pos+1] = x;
}
}
Trang 41Insertion Sort
Bài tập
41
Cho biết các giá trị i pos tương ứng khi dùng thuật
Cho biết các giá trị i, pos tương ứng khi dùng thuật toán Insertion Sort để sắp xếp mảng A giảm dần
A = {2 9 5 12 20 15 -8 10}
Trang 42 Việc tìm vị trí chèn có thể dùng giải thuật tìm kiếm nhị ệ ị g g ậ ị phân.
Nếu dùng giải thuật tìm kiếm nhị phân thì vẫn phải trả giá cho thao tác dời các phần tử sau x
cho thao tác dời các phần tử sau x.
Trang 43int x = a[i], pos = i-1;
while(pos>=0 && a[pos] > x)
a[pos+1]=a[pos] ; pos ;
} a[pos+1] = x;
}
}
Trang 45Quick sort
45
Các giải thuật Bubble sort Selection sort Insertion
Các giải thuật Bubble sort, Selection sort, Insertion sort:
Dễ hiểu, dễ cài đặt , ặ
Hiệu quả thấp: O(n 2 )
Các giải thuật sắp xếp dựa trên so sánh: độ phức
Các giải thuật sắp xếp dựa trên so sánh: độ phức tạp ≥ n × log2n
Quick sort (C A R Hoare, 1962) có thể đạt được Qu c so (C o e, 96 ) có ể đạ được
độ phức tạp trên
Trang 46Quick Sort
Ý tưởng
46
Dựa trên việc phân hoạch dãy ban đầu thành 2
Dựa trên việc phân hoạch dãy ban đầu thành 2 phần:
Dãy con 1: a y 00, a , 11, …, a , , ii có giá trị nhỏ hơn x g ị
Dãy con 2: aj, …, an-1 có giá trị lớn hơn x.
Dãy ban đầu được phân thành 3 phần: y ợ p p
Trang 47Quick Sort
Giải thuật
47
Giải thuật phân hoạch thành 2 dãy con:G ả t uật p â oạc t à dãy co :
1 Chọn phần tử a[k] trong dãy làm giá trị mốc , 0 ≤ k ≤ r-1
x=a[k], i = 0, j = r-1.
Thường chọn phần tử ở giữa dãy: k = ( l+r)/2
2 Phát hiện và hiệu chỉnh cặp phần tử a[i], a[j] sai vị trí
2 1 T khi ( [i] < ) tă i
2.1 Trong khi (a[i] < x), tăng i.
2.2 Trong khi (a[j] >x), giảm j.
2.3 Nếu i<=j thì hoán vị a[i], a[j], tăng i, giảm j
2.3 Nếu i j thì hoán vị a[i], a[j], tăng i, giảm j
3 Nếu i<j: lặp lại bước 2
Ngược lại: dừng.
Trang 48Phân hoạch đoạn l = 1, r = 3, x = a[2]
Trang 50hil ( [i] < ) i++
while (a[i] < x) i++;
Trang 51Quick Sort
Bài tập
51
Chạy tay thuật toán Quick Sort để sắp xếp mảng A
Chạy tay thuật toán Quick Sort để sắp xếp mảng A trong 2 trường hợp tăng dần và giảm dần
A = {2 9 5 12 20 15 -8 10}
Trang 52Quick Sort
Đánh giá
52
Đánh giá giải thuật:
Đánh giá giải thuật:
Hiệu quả phụ thuộc vào việc chọn giá trị mốc
Trang 53Quick Sort
Danh sách liên kết
Với danh sách liên kết:
53
Với danh sách liên kết:
Quick sort sắp xếp hiệu quả nhất trên danh sách liên kết.
Lưu ý: khi cài đặt trên danh sách liên kết, phần tử m ố c duy nh ấ t h ợ p lý là phần tử đầu xâu.
Trang 56Nối L21, X2 và L22 thành L2
Nối L1, X và L2 thành L
19 12
9