You are on page 1of 44

Thuật toán và cấu trúc dữ liệu

Chương 06: Tìm kiếm và sắp xếp

Giảng viên: Lê Thị Hoàng Anh


Email: anhlth@nuce.edu.vn
1
Nội dung

1. Tìm kiếm
– Tìm kiếm tuyến tính
– Tìm kiếm nhị phân
2. Sắp xếp
– Sắp xếp chọn
– Sắp xếp chèn

2
Nội dung
2. Sắp xếp (tiếp)
– Sắp xếp nổi bọt
– Sắp xếp nhanh
– Sắp xếp trộn

3
Giải thuật tìm kiếm
• Một giải thuật tìm kiếm lấy đầu vào là một bài toán
và trả về kết quả là một lời giải bài toán sau khi đã
cân nhắc một loạt các lời giải có thể.
• Tập hợp tất cả các lời giải có thể đối với một bài
toán được gọi là không gian tìm kiếm.
• Thuật toán thử sai (brute-force search) hay tìm kiếm
sơ đẳng không có thông tin sử dụng phương pháp
đơn giản và trực quan nhất.
• Các thuật toán tìm kiếm có thông tin sử dụng
heuristics để áp dụng các tri thức về cấu trúc của
không gian tìm kiếm nhằm giảm thời gian cần thiết
cho việc tìm kiếm
4
Giải thuật tìm kiếm
• Tìm kiếm không có thông tin (Uninformed
Search / Blind Search)
– Tìm kiếm trên danh sách
– Tìm kiếm trên cây
– Tìm kiếm trên đồ thị
• Tìm kiếm có thông tin (Informed Search /
Heuristics Search)
– Tìm kiếm đối kháng
– Thỏa mãn ràng buộc
– Giải thuật di truyền/ thuật toán gien… 5
Tìm kiếm tuyến tính
• Thuật toán này kiểm tra từng phần tử
trong danh sách theo thứ tự của danh
sách đó.
• Độ phức tạp thuật toán thời gian chạy khá
lớn O(n) với n là số phần tử trong danh
sách.
• Không yêu cầu tiền xử lý cho danh sách,
áp dụng cho danh sách bất kỳ.

6
Tìm kiếm nhị phân
• Độ phức tạp thuật toán tốt hơn tìm kiếm
tuyến tính với O(log n).
• Có thể áp dụng cho danh sách lớn nhưng
đòi hỏi:
– Danh sách phải được tiền xử lý, sắp xếp
trước.
– Danh sách phải có khả năng truy cập ngẫu
nhiên.

7
Cài đặt giải thuật tìm kiếm tuần tự
• Tìm kiếm tuần tự:
– Tìm kiếm tuần tự bắt đầu từ đầu hoặc cuối
mảng.
– Trong quá trình duyệt, cần so sánh giá trị khóa
với giá trị phần tử.
– Nếu tìm thấy phần tử có giá trị bằng khóa thì
dừng quá trình tìm kiếm.
– Quá trình tìm kiếm cũng dừng khi đã duyệt hết
danh sách.
– Kết quả là thấy GT khóa hay không? Vị trí nào?
8
Cài đặt giải thuật tìm kiếm tuần tự
• Cài đặt bằng phương thức generics

9
Cài đặt giải thuật tìm kiếm nhị phân
• Ưu điểm: Tìm kiếm rất nhanh so với tìm
kiếm tuần tự, đặc biệt trên danh sách lớn.
• Ý tưởng thực hiện thuật toán. Quy ước:
– Giá trị cần tìm là target value
– Chỉ số đầu tiên của mảng là Lower index
– Chỉ số cuối cùng được gọi là Upper index
– Chỉ số phần tử ở giữa gọi là Median index.
Trong đó: Median =(Lower+Upper)/2

10
Cài đặt giải thuật tìm kiếm nhị phân

11
Cài đặt giải thuật tìm kiếm nhị phân
• Ý tưởng thực hiện thuật toán:
1. Xét đoạn mảng data[Lower…Upper] cần tìm kiếm
phần tử target. Ta so sánh target với phần tử ở vị trí
giữa của mảng(Median = (Lower + Upper)/2). Nếu:
2. Nếu phần tử data[Median] = target. Kết luận và
thoát chương trình.
3. Nếu data[Median] < target. Chỉ thực hiện tìm kiếm
trên đoạn data[Median+1…Upper].
4. Nếu data[Median] > target. Chỉ thực hiện tìm kiếm
trên đoạn data[Lower…Median-1].
5. Lặp lại các bước trên với nửa mảng cần tìm kiếm.
12
Cài đặt giải thuật tìm kiếm nhị phân

• Cài đặt phương thức binarySearch tìm


kiếm nhị phân

binary

13
Cài đặt giải thuật tìm kiếm nhị phân
• Cài đặt bằng phương thức generics

14
Nội dung

1. Tìm kiếm
– Tìm kiếm tuyến tính
– Tìm kiếm nhị phân
2. Sắp xếp
– Sắp xếp chọn
– Sắp xếp chèn

15
Sắp xếp chọn
• Selection Sort là thuật toán sắp xếp đơn
giản dựa trên so sánh tại chỗ. Trong đó:
– Danh sách được chia làm hai phần trái, phải
trong cùng một mảng.
– Phần được sắp xếp ở đầu bên trái và phần
chưa được sắp xếp ở đầu bên phải.
– Lúc đầu phần bên phải là toàn bộ danh sách.
– Mỗi lần lặp chúng ta sẽ tìm được thêm một
phần tử nhỏ nhất (hoặc lớn nhất) trong phần
bên phải để hoán đổi nó thêm vào đúng vị trí
sau phần tử ngoài cùng bên trái. 16
Sắp xếp chọn
• Giải thuật này không thích hợp với tập dữ
liệu lớn.
• Độ phức tạp thuật toán là O(n2)

17
Sắp xếp chọn
• Ý tưởng thực hiện thuật toán

18
Sắp xếp chọn
• Cài đặt bằng phương thức generics

19
Sắp xếp chèn
• Insertion sort là giải thuật sắp xếp đơn
giản dựa trên so sánh in-place.
– Danh sách con luôn được duy trì ở dạng đã
qua sắp xếp.
– Sắp xếp chèn mỗi lần thêm một phần tử vào
danh sách con đã qua sắp xếp. Vị trí chèn
phải được đảm bảo danh sách chèn vào vẫn
theo đúng thứ tự.
– Giải thuật này không thích hợp sử dụng với
tập dữ liệu lớn. Độ phức tạp thuật toán là
O(n2)
20
Sắp xếp chèn
• Ý tưởng thuật toán:

21
Sắp xếp chèn
• Cài đặt bằng phương thức generics

22
Nội dung
2. Sắp xếp (tiếp)
– Sắp xếp nổi bọt
– Sắp xếp nhanh
– Sắp xếp trộn

23
Sắp xếp nổi bọt
• Bubble Sort là thuật toán sắp xếp đơn giản
dựa trên so sánh hai phần tử kề nhau và
tráo đổi thứ tự nếu nó không theo thứ tự
cần sắp xếp.
• Giải thuật sắp xếp nổi bọt chậm nhất trong
số các giải thuật sắp xếp cơ bản. Trường
hợp xấu nhất giải thuật này còn chậm hơn
giải thuật sắp xếp chọn mặc dù số lần so
sánh bằng nhau nhưng do đổi chỗ hai phần
tử kề nhau nên số lần đổi chỗ nhiều hơn.
24
Sắp xếp nổi bọt
• Giải thuật này không thích hợp với tập dữ
liệu lớn.
• Độ phức tạp thuật toán O(n2)

25
Sắp xếp nổi bọt
• Ý tưởng thuật toán:
– Lặp cho đến khi mảng được sắp xếp
– Tại vòng lặp thứ i:
• Duyệt từ phần tử đầu tiên đến phần tử thứ n-i. Nếu
– Hai phần tử kề nhau mà không đúng thứ tự sắp xếp thì
hoán vị cho nhau.
– Ngược lại thì giữ nguyên.
– Nếu tại vòng lặp nào đó mà không tìm thấy
bất kỳ hai phần tử kề nào bị ngược thứ tự thì
hết vòng lặp này ta sẽ kết thúc thuật toán.

26
Sắp xếp nổi bọt
• Ví dụ minh họa

27
Sắp xếp nổi bọt
• Ví dụ minh họa (tiếp)

28
Sắp xếp nổi bọt
• Ví dụ minh họa (tiếp)

29
Sắp xếp nổi bọt
• Cài đặt bằng phương thức generics

30
Sắp xếp nhanh
• Thuật toán sắp xếp nhanh hay còn gọi là
sắp xếp phân đoạn.
• Được phát minh lần đầu bởi C.A.Hoare
vào năm 1960.
• Đây là thuật toán được nghiên cứu và sử
dụng rộng rãi nhất trong các thuật toán
sắp xếp cơ bản.
• Quick Sort cũng là thuật toán đệ quy.

31
Sắp xếp nhanh
• Quick sort là một thuật toán hiệu quả dựa trên
việc phân chia mảng dữ liệu thành các nhóm
phần tử nhỏ hơn.
• Sắp xếp nhanh chia mảng thành hai phần bằng
cách so sánh từng phần tử của mảng với phần
tử được gọi là phần tử chốt.
– Một phân đoạn bao gồm các phần tử nhỏ hơn hoặc
bằng phần tử chốt.
– Một phân đoạn gồm các phần tử lớn hơn phần tử
chốt

32
Sắp xếp nhanh
• Kỹ thuật chọn phần tử chốt:
– Ảnh hưởng nhiều đến khả năng rơi vào vòng
lặp vô hạn đối với các trường hợp đặc biệt.
– Tốt nhất chọn phần tử nằm phía giữa mảng.
Khi đó sau log2n lần chia ta đạt được kích
thước mảng con bằng một.
– Một số cách chọn phần tử chốt:
• Chọn phần tử đứng đầu hoặc cuối mảng làm chốt
• Chọn phần tử chính giữa mảng làm phần tử chốt
• Chọn phần tử nằm giữa trong mảng làm chốt
• Chọn bất kỳ, khi đó dễ rơi vào trường hợp đặc biệt
33
Sắp xếp nhanh
• Ý tưởng thuật toán phân chia mảng:
– Chọn phần tử chốt
– Khai báo hai biến con trỏ để duyệt hai phía của
phần tử chốt.
• Biến bên trái để:
– Trỏ đến từng phần tử của mảng con bên trái phần tử chốt.
– Nếu phần tử đó vẫn nhỏ hơn phần tử chốt thì tiếp tục di
chuyển sang bên phải.
• Biến bên phải để:
– Trỏ đến từng phần tử của mảng con bên phải phần tử chốt.
– Nếu phần tử đó vẫn còn lớn hơn phần tử chốt thì tiếp tục di
chuyển sang bên trái.
34
Sắp xếp nhanh
• Ý tưởng thuật toán phân chia mảng: (tiếp)
– Khi hai biến trỏ left và right dừng(gặp phải
phần tử nghịch) mà left vẫn còn nhỏ hơn right
thì đổi chỗ hai phần tử này cho nhau và tiếp
tục thực hiện bước duyệt bên trên.
– Khi vòng lặp thao tác duyệt trên kết thúc:
• Đổi chỗ phần tử min cho phần tử right
• Trả về chỉ số phần tử dùng để phân chia mảng là
right

35
Sắp xếp nhanh
• Cài đặt bằng phương thức generics

36
Sắp xếp nhanh

37
Sắp xếp trộn
• Thuật toán Merge Sort là một trong những
thuật toán có độ phức tạp ở mức trung
bình.
• Thuật toán sắp xếp trộn cũng sử dụng
phương pháp chia để trị như thuật toán
sắp xếp nhanh.
• Độ phức tạp thuật toán là O(nlog(n))
• Không chỉ có tốc độ tốt mà sắp xếp trộn
còn giữ lại được thứ tự các phần tử bằng
nhau sau khi sắp xếp 38
Sắp xếp trộn
• Ý tưởng thuật toán

39
Sắp xếp trộn
• Áp dụng thuật toán cho mảng {25, 30, 45,
6, 11, 90, 15}

40
Sắp xếp trộn
• Cài đặt bằng phương thức generics:

41
Sắp xếp trộn
• Phương thức trộn

42
Sắp xếp trộn
• Phương thức trộn (Tiếp)

43
Thảo luận

GV: Lê Thị Hoàng Anh 44

You might also like