Thiết Kế & Đánh Giá Thuật Toán Sắp Xếp Nhanh

TS. Lê Nguyên Khôi Trường Đại Học Công Nghệ - ĐHQGHN

(cid:1) Chia để trị (cid:1) Phân hoạch (cid:1) Phân tích trường hợp xấu nhất (cid:1) Phân hoạch ngẫu nhiên (cid:1) Phân tích

1

Nội Dung

(cid:1) Đề xuất bởi C.A.R. Hoare, 1962 (cid:1) Dựa trên kỹ thuật Chia – Để – Trị (cid:1) Hiệu quả trong thực tế (tinh chỉnh)

2

Sắp Xếp Nhanh

Chia Để Trị

(cid:1) Chia: phân hoạch mảng thành 2 mảng con dựa trên phần tử chốt (cid:2) sao cho các phần tử thuộc mảng con bên trái ≤ (cid:2) và các phần tử thuộc mảng con bên phải ≥ (cid:2)

(cid:1) Trị: áp dụng đệ quy sắp xếp 2 mảng con (cid:1) Gộp: hiển nhiên

Sắp xếp nhanh mảng (cid:1)-phần tử tăng dần:

3

Lưu ý: phân hoạch với thời gian tuyến tính

⇒ ⇒

(cid:6) (cid:8), (cid:9) chốt (cid:6) (cid:8)

Phân Hoạch – Mã Giả Partition (cid:5)(cid:6), (cid:8), (cid:9)(cid:10)

(cid:2) ← (cid:6) (cid:8) (cid:13) ← (cid:8) for (cid:14) ← (cid:8) (cid:15) 1 to (cid:9) do if (cid:6) (cid:14) ≤ (cid:2) then (cid:13) ← (cid:13) (cid:15) 1 exchange (cid:6) (cid:13) ↔ (cid:6) (cid:14)

exchange (cid:6) (cid:8) ↔ (cid:6) (cid:13) return (cid:13) Duy trì

4

Phân Hoạch – Ví Dụ

5 8 3 2 11 i=1 j j=2->4

6 10 13 i 6 8 i=2

3 2 11 j j=5->6

5 13 10 i 5 6 8 13

3 10 i 3 5 6 8 13 10 11

5

2 i 3 6 5 2 i=3 2 11 j j=7 i=4 j j=8 8 13 10 11 i=4

Phân Hoạch – Cách Khác

Partition (cid:5)(cid:6), (cid:8), (cid:9))

(cid:2) ← (cid:6) (cid:9)

⇒ (cid:6) (cid:8), (cid:9) ⇒ chốt (cid:6) (cid:9)

Xem tr. 171-172

6

7

Phân Hoạch – Bài Tập 7.1-1 tr.173

Sắp Xếp Nhanh - Mã Giả

QuickSort (cid:5)(cid:6), (cid:8), (cid:9)) if (cid:8) < (cid:9) then

(cid:19) ← Partition (cid:6), (cid:8), (cid:9) QuickSort ((cid:6), (cid:8), (cid:19) − 1) QuickSort ((cid:6), (cid:19) + 1, (cid:9))

8

Lời gọi hàm đầu tiên: QuickSort (cid:5)(cid:6), 1, (cid:1))

(cid:1) Giả sử các phần tử của dãy khác nhau (không có 2 phần tử nào bằng nhau) (cid:1) Thực tế có một số thuật toán phân hoạch khác tốt hơn cho trường hợp có phần tử bằng nhau.

(cid:1) Cho (cid:21)(cid:5)(cid:1)(cid:10) là thời gian chạy trong trường

Sắp Xếp Nhanh - Phân Tích

9

hợp xấu nhất với mảng (cid:1) phần tử.

(cid:1) Mảng đã được sắp xếp. (cid:1) Phân hoạch dựa trên phần tử chốt là phần tử

Trường Hợp Xấu Nhất

lớn nhất hoặc nhỏ nhất của mảng.

(cid:1) Một trong hai mảng con luôn luôn không có

phần tử nào.

10

(cid:21) (cid:1) = (cid:21) 0 (cid:15) (cid:21) (cid:1) − 1 + (cid:24) (cid:1) = (cid:24) 1 + (cid:21) (cid:1) − 1 + (cid:24) (cid:1) = (cid:21) (cid:1) − 1 + (cid:24) (cid:1) ∈ (cid:24) (cid:1)(cid:26)

Trường Hợp Xấu Nhất

(cid:1) Thay thế (cid:1) Số học (cid:1) Cây đệ quy (cid:1) Định lý tổng quát

(cid:1)Phải ở dạng (cid:21) (cid:1) = (cid:27)(cid:21) (cid:1)/(cid:29) (cid:15) (cid:30) (cid:1)

11

(cid:21) (cid:1) = (cid:21) (cid:1) − 1 + (cid:24) (cid:1)

Trường Hợp Tốt Nhất !!!

Partition chia mảng thành 2 phần bằng nhau (may mắn)

(cid:21) (cid:1)

(giống MergeSort)

= 2(cid:21) (cid:1)/2 (cid:15) (cid:24) (cid:1) = (cid:24) (cid:1) log (cid:1)

12

Trường Hợp Khác

Partition chia mảng với tỉ lệ

?

:

# #$

& #$

(cid:21) (cid:1)

= (cid:21)

(cid:1) (cid:15) (cid:21)

(cid:1) (cid:15) (cid:24) (cid:1)

# #$

& #$

Thời gian chạy (cid:21) (cid:1) = ?

((cid:1) log#$ (cid:1) ≤ (cid:21) (cid:1) ≤ ((cid:1) log#$/& (cid:1) (cid:15) )(cid:5)(cid:1)(cid:10)

13

Trường Hợp Khác

Giả sử phân hoạch liên tục theo trường hợp xấu nhất và tốt nhất

tốt nhất xấu nhất

* (cid:1) = 2+ (cid:1)/2 + (cid:24) (cid:1) + (cid:1) = * (cid:1) − 1 + (cid:24) (cid:1)

* (cid:1) = 2 *

− 1 + (cid:24)

+ (cid:24) (cid:1)

(cid:1) 2

(cid:1) 2

= 2*

− 1 + (cid:24) (cid:1)

(cid:1) 2

* (cid:1) ∈ (cid:24) (cid:1) log (cid:1)

14

Phân Hoạch Ngẫu Nhiên

Phân hoạch dựa trên phần tử ngẫu nhiên: (cid:1) Thời gian chạy không phụ thuộc vào dữ

(cid:1) Không cần giả thiết về phân phối của dữ

liệu đầu vào.

(cid:1) Không dữ liệu nào tạo nên trường hợp

liệu đầu vào.

(cid:1) Trường hợp xấu nhất chỉ do hàm sinh số

xấu nhất.

15

ngẫu nhiên.

(cid:1) Giả thiết khi phân tích thời gian chạy (cid:1) Mảng bao gồm các phần tử khác nhau

(cid:1) Mảng có các phần tử giống nhau? (cid:1) Trường hợp đặc biệt, mảng toàn các

Phân Hoạch – Vấn Đề Khác

16

phần tử giống nhau (cid:1) Thời gian chạy theo trường hợp xấu nhất

(cid:1) Giả thiết khi phân tích thời gian chạy (cid:1) Mảng bao gồm các phần tử khác nhau

(cid:1) Mảng có các phần tử giống nhau? (cid:1) Trường hợp đặc biệt, mảng toàn các

Phân Hoạch – Vấn Đề Khác

17

phần tử giống nhau (cid:1) Thời gian chạy theo trường hợp xấu nhất

(cid:1) Phân hoạch thành 3 mảng con

(cid:1) Mảng con bên trái < (cid:2) (cid:1) Mảng con bên phải > (cid:2) (cid:1) Mảng con ở giữa = (cid:2)

(cid:1) Thời gian chạy nhanh hơn (cid:1) Trường hợp đặc biệt, tất cả các phần tử

Phân Hoạch – Vấn Đề Khác

(cid:1) Mã giả?

18

mảng giống nhau (cid:1) Thời gian chạy tuyến tính

(cid:1) Sắp xếp nhanh nói chung là thuật toán

Áp Dụng Thực Tế

(cid:1) Thông thường sắp xếp nhanh chạy

sắp xếp khá tốt.

(cid:1) Sắp xếp nhanh có thể hưởng lợi đáng kể

nhanh hơn gấp đôi so với sắp xếp gộp. (cid:1) Hằng số ( trong (cid:24) (cid:1) tương đối nhỏ

(cid:1) Sắp xếp nhanh chạy khá tốt với cả bộ

từ việc tùy chỉnh mã.

19

nhớ đệm và bộ nhớ ảo.