You are on page 1of 34

Các thuật toán sắp xếp (1)

Cấu trúc dữ liệu và giải thuật


Bùi Duy Đăng
Nội dung
• Các thuật toán tìm kiếm
• Các thuật toán sắp xếp

Cấu trúc dữ liệu và giải thuật 2


Các thuật toán tìm kiếm

Cấu trúc dữ liệu và giải thuật 3


Các thuật toán tìm kiếm
• Tìm kiếm tuyến tính (tuần tự)
• Duyệt từng phần tử có trong mảng
• Best case, worst case?

• Tìm kiếm nhị phân


• Tìm kiếm phần tử có trong mảng có tính đơn điệu (monotonicity)
• Best case, wort case?

Cấu trúc dữ liệu và giải thuật 4


Tìm kiếm tuyến tính (tuần tự)
• Cho một mảng có n phần tử và phần tử key, tìm phần tử key
có trong mảng và trả về vị trí

Cấu trúc dữ liệu và giải thuật 5


Tìm kiếm nhị phân
• Cho một mảng có n phần tử đã được sắp xếp và phần tử key,
tìm phần tử key có trong mảng và trả về vị trí

Cấu trúc dữ liệu và giải thuật 6


Dùng vòng lặp
• Phần tử left, right, mid
• Có 3 trường hợp
Phần tử mid == key
Phần tử mid < key
Phần tử mid > key

Cấu trúc dữ liệu và giải thuật 7


Dùng đệ quy
• Phần tử left, right, mid
• Có 3 trường hợp
Phần tử mid == key
Phần tử mid < key
Phần tử mid > key

Cấu trúc dữ liệu và giải thuật 8


Mở rộng
• Trong thực tế, tìm kiếm nhị phân được sử dụng trong trường
hợp nào?

• Tìm kiếm tam phân (tenary search)

Cấu trúc dữ liệu và giải thuật 9


Các thuật toán sắp xếp

Cấu trúc dữ liệu và giải thuật 10


Một số phân loại
• Sắp xếp In-place và Not-in-place
• Chỉ sử dụng một mảng (in-place) và sử dụng thêm bộ nhớ (not-in-place)
• Sắp xếp Stable và Not stable

Cấu trúc dữ liệu và giải thuật 11


Một số phân loại
• Sắp xếp sử dụng và không sử dụng phép so sánh

• Sắp xếp thích ứng (Adaptability): tận dụng và không tận dụng
mảng sắp xếp một phần

•…
Sắp xếp sử dụng phép so sánh Sắp xếp không sử dụng phép so sánh
Bubble sort, Insertion sort, Selection sort Counting sort
Quick sort, merge sort, heap sort Radix sort

Cấu trúc dữ liệu và giải thuật 12


Sắp xếp nổi bọt (Bubble sort)
Ý tưởng
So sánh hai phần tử kề
nhau để hoán vị phần tử
lớn/nhỏ đến khi mảng được
sắp xếp

Cấu trúc dữ liệu và giải thuật 13


Sắp xếp nổi bọt (Bubble sort)

Cấu trúc dữ liệu và giải thuật 14


Độ phức tạp
• Kích thước đầu vào:
• Thao tác cơ sở:
• Thiết lập công thức: O(n2)?

Cấu trúc dữ liệu và giải thuật 15


Sắp xếp chọn (Selection sort)
Ý tưởng
Chọn phần tử nhỏ nhất
và đưa nó về vị trí đầu của phần
chưa được sắp xếp trong mảng

Cấu trúc dữ liệu và giải thuật 16


Sắp xếp chọn (Selection sort)

Cấu trúc dữ liệu và giải thuật 17


Độ phức tạp
• Kích thước đầu vào:
• Thao tác cơ sở:
• Thiết lập công thức: O(n2)?
• Số phép hoán vị:
• Trường hợp xấu nhất: O(n)
• Trường hợp tốt nhất (mảng đã sắp tứ tự tăng dần): 0

Cấu trúc dữ liệu và giải thuật 18


Mở rộng
• Sắp xếp chèn (Insertion sort)
• Độ phức tạp: O(n2)

• Sắp xếp Shell (Shell sort), tên tác giả


• Độ phức tạp có thể đạt: O(n(log2n)2)

Cấu trúc dữ liệu và giải thuật 19


Sắp xếp “cây” (Heap sort)
• Được đề xuất vào năm 1964 bởi J.W.J. Williams trên tạp chí
Communication of the ACM

• Đây là thuật toán sắp xếp chậm nhất trong số các thuật toán có
độ phức tạp O(n*log2n)

• Không sử dụng mảng phụ

Cấu trúc dữ liệu và giải thuật 20


Ý tưởng
• Ví dụ

Cấu trúc dữ liệu và giải thuật 21


Định nghĩa Heap
• Là cây nhị phân đầy đủ
• Là cây đầy đủ
• Giá trị mỗi nút không bao giờ bé/lớn hơn giá trị của các nút con
• Hệ quả
• Nút lớn/nhỏ nhất là

Cấu trúc dữ liệu và giải thuật 22


Biểu diễn Heap bằng cây

Cấu trúc dữ liệu và giải thuật 23


Biểu diễn Heap bằng mảng

Cấu trúc dữ liệu và giải thuật 24


Biểu diễn Heap bằng mảng
• Nút gốc ở chỉ số [0]
• Nút cha của nút [i] có chỉ số là [(i-1)/2]
• Các nút con của nút [i] (nếu có) có chỉ số [2i+1] và [2i+2]
• Ví dụ:
• Nút con của nút [0] là nút [1] và nút [2]
• Nút cha của nút [7] là nút [3]
• Nút cha của nút [8] là nút [3]

Cấu trúc dữ liệu và giải thuật 25


Thao tác Heapify
• Điều chỉnh 1 phần tử
• Đổi chỗ nút cha với nút
con có giá trị lớn nhất

Cấu trúc dữ liệu và giải thuật 26


Thao tác Heapify
• Điều chỉnh 1 phần tử
• Đổi chỗ nút cha với nút
con có giá trị lớn nhất

Cấu trúc dữ liệu và giải thuật 27


Thao tác Heapify
• Điều chỉnh 1 phần tử
• Đổi chỗ nút cha với nút
con có giá trị lớn nhất

Cấu trúc dữ liệu và giải thuật 28


Thao tác Heapify

Cấu trúc dữ liệu và giải thuật 29


Thuật toán Heap sort
• Xây dựng Heap (1): Sử dụng thao tác Heapify để chuyển đổi
một mảng bình thường thành Heap
• Sắp xếp (2):
• Hoán vị phần tử cuối cùng của Heap với phần tử đầu tiên của Heap (có
giá trị lớn nhất)
• Loại bỏ phần tử cuối cùng
• Thực hiện thao tác Heapify để điều chỉnh phần tử đầu tiên

Cấu trúc dữ liệu và giải thuật 30


Xây dựng Heap
• Tất cả các phần tử trên mảng có chỉ số [n/2] đến [n-1] đều là
nút lá
• Mỗi nút lá được xem là Heap có một phần tử
• Thực hiện thao tác Heapify trên các phần tử có chỉ số từ [n/2]-1
đến [0]

Cấu trúc dữ liệu và giải thuật 31


Xây dựng Heap

Cấu trúc dữ liệu và giải thuật 32


Sắp xếp

Cấu trúc dữ liệu và giải thuật 33


Độ phức tạp
• Kích thước đầu vào:
• Thao tác cơ sở:
• Thiết lập công thức: O(n*log2n)?

• Heap sort ổn định trong mọi trường hợp

Cấu trúc dữ liệu và giải thuật 34

You might also like