THUẬT TOÁN SẮP XẾP Sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng theo một thứ tự được ấn định, chẳng hạn tăng dần hay giảm dần đối với một dãy số.. d Độ phức tạp của
Trang 1ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
BÀI THU HOẠCH MÔN HỌC PHƯƠNG PHÁP
NGHIÊN CỨU KHOA HỌC TRONG TIN HỌC
LỚP CAO HỌC KHOA HỌC MÁY TÍNH KHÓA 22
Giảng viên: GS.TSKH Hoàng Văn Kiếm
ĐỀ TÀI
NGUYÊN LÝ SÁNG TẠO ỨNG DỤNG
TRONG MỘT SỐ THUẬT TOÁN SẮP XẾP NỘI
Học viên: Trần Huy Quang
Mã số: 12 11 058
TP.HCM, 12-2012
Trang 2MỤC LỤC
THUẬT TOÁN SẮP XẾP 4
I Sắp xếp theo phương pháp chọn 5
1 Phương pháp chọn trực tiếp – Selection Sort 5
2 Phương pháp vun đống – Heap Sort 6
3 Đánh giá 9
II Sắp xếp theo phương pháp chèn 10
1 Phương pháp chèn trực tiếp – Insertion Sort 10
2 Phương pháp độ dài bước giảm dần - Shell Sort 11
3 Đánh giá 13
III Phương pháp sắp xếp phân hoạch - Quick Sort 14
1 Ý tưởng 14
2 Thuật toán 14
3 Minh họa 14
4 Độ phức tạp của thuật toán 15
5 Đánh giá 16
PHỤ LỤC: CÁC NGUYÊN LÝ SÁNG TẠO 17
1 Nguyên lý phân nhỏ 17
2 Nguyên lý “tách khỏi” 17
3 Nguyên lý phẩm chất cục bộ 17
4 Nguyên lý phản đối xứng 17
5 Nguyên lý kết hợp 17
6 Nguyên lý vạn năng 17
7 Nguyên lý “chứa trong” 17
8 Nguyên lý phản trọng lượng 17
9 Nguyên lý gây ứng suất sơ bộ 18
10 Nguyên lý thực hiện sơ bộ 18
11 Nguyên lý dự phòng 18
12 Nguyên lý đẳng thế 18
13 Nguyên lý đảo ngược 18
14 Nguyên lý cầu (tròn) hóa 18
Trang 316 Nguyên lý giải “thiếu” hoặc “thừa” 19
17 Nguyên lý chuyển sang chiều khác 19
18 Nguyên lý sử dụng các dao động cơ học 19
19 Nguyên lý tác động theo chu kỳ 19
20 Nguyên lý liên tục tác động có ích 19
21 Nguyên lý “vượt nhanh” 20
22 Nguyên lý biến hại thành lợi 20
23 Nguyên lý quan hệ phản hồi 20
24 Nguyên lý sử dụng trung gian 20
25 Nguyên lý tự phục vụ 20
26 Nguyên lý sao chép (Copy) 20
27 Nguyên lý “rẻ” thay cho “đắt” 20
28 Thay thế sơ đồ cơ học 20
29 Sử dụng các kết cấu khí và lỏng 21
30 Sử dụng vỏ dẻo và màng mỏng 21
31 Sử dụng các vật liệu nhiều lỗ 21
32 Nguyên lý thay đổi màu sắc 21
33 Nguyên lý đồng nhất 21
34 Nguyên lý loại bỏ hoặc tái sinh từng phần 21
35 Thay đổi các thông số lý hóa của đối tượng 22
36 Sử dụng chuyển pha 22
37 Sử dụng sự nở nhiệt 22
38 Sử dụng các chất oxy hóa 22
39 Sử dụng môi trường trơ 22
40 Sử dụng các vật liệu hợp thành (composite) 22
TÀI LIỆU THAM KHẢO 23
Trang 4THUẬT TOÁN SẮP XẾP
Sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng theo một thứ tự được ấn định, chẳng hạn tăng dần hay giảm dần đối với một dãy số Với một cấu trúc đã được sắp xếp thì rất thuận tiện khi thực hiện các tác vụ như tìm kiếm, duyệt cấu trúc…
Có hai loại thuật toán sắp xếp: Sắp xếp nội và Sắp xếp ngoại
Sắp xếp nội
- Toàn bộ dữ liệu được đưa vào bộ nhớ trong
- Kích thước dữ liệu cần sắp xếp không lớn lắm
- Thời gian sắp xếp được thực hiện rất nhanh
Sắp xếp ngoại
- Chỉ một phần nhỏ dữ liệu cần sắp xếp được đưa vào bộ nhớ trong, phần lớn
dữ liệu còn lại được lưu ở bộ nhớ ngoài (đĩa cứng, băng từ…)
độ phức tạp của thuật toán
Khi xây dựng thuật toán sắp xếp, cần tìm cách giảm thiểu những phép so sánh và hoán vị không cần thiết để tăng hiệu quả của thuật toán Do dãy số được lưu trọn vẹn trong bộ nhớ chính của máy tính, nên các thuật toán sắp xếp nội thường không sử dụng các vùng nhớ thêm trong quá trình sắp xếp, mà hướng đến sắp xếp trực tiếp trên dãy số ban đầu
Một số thuật toán sắp xếp nội đề cập trong đề tài gồm Selection Sort, Heap Sort, Insertion Sort, Shell Sort, và Quick Sort
Trong đó những thuật toán như Selection Sort, Insertion Sort là những thuật toán đơn giản nhưng có chi phí cao Trong khi các thuật toán Shell Sort, Heap Sort, và Quick
Trang 5Xét dãy con sau chỉ còn N-1 phần tử cần sắp xếp, lặp lại thao tác trên để đưa phần
tử nhỏ nhất về đầu dãy hiện hành Ta được dãy con đầu a 1 , a 2 đã có thứ tự, chỉ cần sắp
xếp dãy con sau có N-2 phần tử còn lại
Lặp lại như trên cho đến khi dãy con cần sắp xếp chỉ còn một phần tử, ta được dãy kết quả có thứ tự
b) Thuật toán
Bước 1: i := 1
Bước 2: Tìm phần tử amin nhỏ nhất trong dãy hiện hành a i , a i+1 , …, a N
Bước 3: Hoán vị amin và a i
Bước 4: Nếu i < N-1: tăng i thêm 1 và lặp lại Bước 2
Trang 6d) Độ phức tạp của thuật toán
- Số phép so sánh: tại mỗi lượt thứ i, cần thực hiện N-i phép so sánh để tìm phần
tử nhỏ nhất trong dãy con chưa có thứ tự Số phép so sánh không phụ thuộc vào
tình trạng của dãy ban đầu, do đó tổng số phép so sánh là n(n-1)/2
- Số phép gán: tại mỗi lượt, cần thực hiện ba phép gán để hoán vị a min với a i, do
đó cần 3n(n-1)/2 phép gán Tuy nhiên điều này phụ thuộc vào tình trạng ban
đầu của dãy số, nếu dãy ban đầu đã có thứ thự thì không cần thực hiện phép gán nào
- Độ phức tạp của thuật toán là T(N) = O(N2)
2 Phương pháp vun đống – Heap Sort
a) Ý tưởng
Sử dụng một cấu trúc dữ liệu gọi là Heap cho phép tích lũy các thông tin về sự so
sánh giữa các phần tử trong quá trình sắp xếp
Cấu trúc Heap
Là một cây nhị phân gần đầy đủ, cài đặt bằng mảng một chiều a l a l+1 …a r, với các
nút trên heap có nội dung nhỏ hơn hay bằng nội dung của nút cha
Trang 7Tính chất của Heap
1 Heap có nút gốc lớn nhất, đánh theo chỉ số 0, 1, 2,… cho các nút kế tiếp
Đướng đi từ gốc đến nút lá có nội dung - giá trị nút giảm dần
2 Nếu a l a l+1 …a r là một heap, khi cắt bỏ một số phần tử ở hai đầu của heap, thì dãy còn lại vẫn là một heap
3 Heap con: SubHeap(p,m), có nút gốc là p và các nút con nhỏ hơn hay bằng m (nếu p > m thì subheap rỗng)
4 Mọi dãy a l a l+1 …a r với 2l > r là một heap
b) Thuật toán
Giai đoạn 1: Hiệu chỉnh dãy số ban đầu thành heap
a l a l+1 …a r Với l=0 và r=N-1
Giai đoạn 2: Sắp xếp dãy số dựa trên heap
Bước 1: Hoán vị phần tử lớn nhất - nút gốc của heap với phần tử cuối dãy
Bước 2: Loại bỏ phần tử lớn nhất ra khỏi heap: r=r-1
Hiệu chỉnh phần còn lại của dãy là a l a l+1 …a r-1 thành heap
Bước 3: Nếu r>l: lặp lại Bước 2
Giai đoạn 1: Hiệu chỉnh dãy ban đầu thành heap
Dãy ban đầu 12 2 8 5 1 6 4 15
Trang 8Giai đoạn 2: Sắp xếp dãy số dựa trên heap
Heap ban đầu 15 12 8 5 1 6 4 2
d) Độ phức tạp của thuật toán
- Độ phức tạp của thuật toán là T(N) = O(Nlog2N)
Trang 9gọi là Heap trong thuật toán Heap Sort Từ Selection Sort đến Heap Sort thể hiện những
nguyên lý sáng tạo ứng dụng như sau
- Nguyên lý phân nhỏ
Dãy số biểu diễn bằng mảng một chiều được chuyển sang cấu trúc heap là một cây
phân cấp, như vậy một dãy đồng nhất đã được phân chia thành các thành phần độc lập, chính là các nhánh của cây Do đó trong quá trình sắp xếp, số lượng phép so sánh và phép gán được giảm thiểu do thuật toán chỉ làm việc trên một số nhánh liên quan tại mỗi bước của thuật toán
- Nguyên lý phẩm chất cục bộ
Cấu trúc mảng một chiều tuyến tính được chuyển thành cấu trúc cây phân cấp, cụ
thể là cây nhị phân Trong đó, một phần tử ở mức i là phần tử lớn trong cặp phần tử ở mức i+1, do đó phần tử ở mức 0 tức là nút gốc của cây luôn là phần tử lớn nhất trong
dãy Khi loại phần tử gốc ra khỏi cây, cần phải cập nhật lại cây để đảm bảo tính chất
của heap, tuy nhiên việc cập nhật chỉ xảy ra một cách cục bộ đối với những nhánh liên
quan đến phần tử vừa loại bỏ, còn các nhánh khác vẫn giữ nguyên Như vậy bước tiếp theo của thuật toán có thể sử dụng lại kết quả của sự so sánh ở bước hiện tại
- Nguyên lý linh động
Dãy số được biểu diễn một cách tự nhiên bằng cấu trúc mảng một chiều, nhưng với
heap, dãy số có thể biểu diễn dưới dạng cây phân cấp Với đặc trưng của cấu trúc cây
gồm nhiều nhánh, dãy số được chia thành nhiều thành phần độc lập dưới dạng các
nhánh và có khả năng dịch chuyển đối với nhau, mỗi khi cập nhật heap trong quá trình
sắp xếp
- Nguyên lý chuyển sang chiều khác
Ở mỗi bước sắp xếp, Selection Sort hoạt động trên toàn bộ chiều dài của dãy con còn lại nên số lượng phép so sánh luôn nhiều nhất Hạn chế đó là do cấu trúc của mảng
một chiều Trong khi Heap Sort sử dụng cấu trúc heap là cấu trúc cây - nhiều chiều, tại
mỗi bước, việc so sánh chỉ xảy ra trong nhánh liên quan nên có thể giảm thiểu số phép
so sánh
Trang 10- Thay thế sơ đồ cơ học
Phương pháp Heap Sort sử dụng cấu trúc cây phân cấp thay cho mảng một chiều với các phần tử cố định Như vậy các phần tử đồng nhất trong dãy số đã được chuyển sang cấu trúc không đồng nhất, mỗi phần tử được phân cấp qua giá trị của nó
- Nguyên lý loại bỏ hoặc tái sinh từng phần
Cấu trúc heap có nút gốc luôn là phần tử lớn nhất trong dãy hiện hành, nếu loại bỏ
phần tử này khỏi cây, có nghĩa là đưa nó về vị trí đúng thì sau đó không cần quan tâm
đến nó nữa Sau khi loại bỏ nút gốc, heap cần phải phục hồi với những phần tử còn lại,
tuy nhiên chi phí cho thao tác này không lớn, do việc cập nhật chỉ xảy ra cục bộ trên những nhánh liên quan trong cây
II Sắp xếp theo phương pháp chèn
1 Phương pháp chèn trực tiếp – Insertion Sort
a) Ý tưởng
Từ dãy ban đầu, ta luôn có dãy con a 1 đã có thứ tự Chèn phần tử a 2 vào dãy con đã
có thứ tự trên, ta được dãy con có thứ tự mới a 1 , a 2 Lặp lại cho đến khi chèn xong phần
tử a N vào dãy con đã có thứ tự, ta được dãy kết quả có thứ tự
Như vậy, với dãy con đã có thứ tự là a1 , a 2 , …, a i-1 , cần tìm cách chèn phần tử a i
vào vị trí thích hợp:
- Xét 1 ≤ k ≤ i, vị trí thích hợp của a i là vị trí ở giữa a k-1 và a k nếu a k-1 ≤ a i < a k
- Dời các phần tử a k , a k+1 , …, a i-1 về phía sau một vị trí và chèn a i vào vị trí k,
ta được dãy a1 , a 2 , …, a i-1 có thứ tự
b) Thuật toán
Bước 1: i := 2
Bước 2: x := ai
Tìm vị trí k thích hợp trong dãy con a 1 , a 2 , …, a i-1 để chèn a i vào
Bước 3: Dời chỗ các phần tử ak , a k+1 , …, a i-1 về phía sau một vị trí
Bước 4: ak := x
Bước 5: i := i+1
Nếu i N: Lặp lại Bước 2
Ngược lại: Dừng
Trang 11d) Độ phức tạp của thuật toán
- Trong mỗi lần lặp, cần thực hiện một phép so sánh và hai phép gán Tổng số phép so sánh và phép gán phụ thuộc vào tình trạng ban đầu của dãy
- Độ phức tạp của thuật toán là T(N) = O(N2)
2 Phương pháp độ dài bước giảm dần - Shell Sort
Thực hiện sắp xếp các phần tử trong cùng dãy con ta có các phần tử được đưa về vị
trí đúng tương đối – có thứ tự trong dãy con đang xét Sau đó giảm khoảng cách h để
tạo thành các dãy con mới, như vậy tạo cơ hội so sánh một phần tử với nhiều phần tử
Trang 12khác trước đó không nằm cùng dãy con Sắp xếp những dãy con mới này Lặp lại cho
đến khi h=1, ta được dãy kết quả có thứ tự
Cách lựa chọn khoảng cách h và số bước sắp xếp là k thỏa:
hi > hi+1, hk =1, với i=1 k
Khoảng cách giữa các phần tử trong một dãy con ở bước sau phải nhỏ hơn bước
trước Sau k bước, khoảng cách bằng 1 (lúc này mỗi dãy con chỉ có một phần tử)
Theo Knuth đề nghị: hi = (h i-1 - 1)/3, h k =1, k=log 3 n – 1
Hoặc: h i = (h i-1 - 1)/2, h k =1, k=log 2 n - 1
b) Thuật toán
Bước 1: Chọn k khoảng cách h1 , h 2 , …, h k
i := 1
Bước 2: Chia dãy ban đầu thành các dãy con cách nhau hi phần tử
Sắp xếp từng dãy con theo phương pháp Chèn trực tiếp
Trang 13Sắp xếp các dãy con theo phương pháp Chèn trực tiếp
d) Độ phức tạp của thuật toán
- Hiệu quả thuật toán phụ thuộc vào các dãy con với các độ dài được chọn
- Khi chọn theo công thức Knuth: h i = (h i-1 -1)/2, h k =1, k=log 2 n-1, thuật toán có
độ phức tạp là T(N) = O(N1.2)
3 Đánh giá
Hai thuật toán Insertion Sort và Shell Sort cùng dựa trên ý tưởng chèn một phần tử vào một dãy có thứ tự Tuy nhiên độ phức tạp của thuật toán Shell Sort là O(N1.2) nhỏ hơn rất nhiều so với độ phức tạp O(N2) của Insertion Sort Sự cải tiến này có thể nói là kết quả của việc ứng dụng những nguyên lý sáng tạo trong quá trình xây dựng thuật toán
- Nguyên lý phân nhỏ
Trong phương pháp Shell Sort, dãy ban đầu được chia thành nhiều dãy con độc lập
và tiến hành sắp xếp trên từng dãy con, giúp giảm thiểu số phép so sánh và phép gán Rồi tiếp tục tăng mức độ phân nhỏ các dãy con, cho đến khi độ dài của mỗi dãy con chỉ
là một thì được dãy kết quả có thứ tự
- Nguyên lý thực hiện sơ bộ
Trong phương pháp Insertion Sort, phần tử cần chèn luôn được so sánh trong một dãy tổng thể có độ dài tối đa, dẫn đến mất thời gian so sánh và dịch chuyển
Phương pháp Shell Sort thực hiện sắp xếp các phần tử trong cùng dãy con để đưa chúng về vị trí đúng tương đối rất nhanh – chỉ có thứ tự trong dãy con đang xét Sau đó
Trang 14giảm độ dài các dãy con, tạo cơ hội so sánh một phần tử với nhiều phần tử khác trước
đó không nằm cùng dãy con với nó
- Nguyên lý linh động
Phương pháp Shell Sort chia dãy ban đầu thành các phần xen kẽ và tiến hành sắp xếp trên từng phần Các phần này có khả năng dịch chuyển đối với nhau khi giảm
khoảng cách h, khi đó mức độ xen kẽ tăng lên và các phần có cơ hội tương tác với nhau
III Phương pháp sắp xếp phân hoạch - Quick Sort
Ngược lại, dãy con 1 và 3 có nhiều hơn một phần tử, tiếp tục phân hoạch dãy con 1
và 3 thành các dãy con tương tự như trên
Phần tử x được chọn có tác động rất nhiều đến hiệu quả của thuật toán, vì nó quyết định số lần phân hoạch dãy Số lần phân hoạch sẽ ít nhất nếu chọn được phần tử x có độ lớn trung bình của dãy Tuy nhiên việc chọn được phần tử x như vậy là rất khó, nên
người ta thường chọn phần tử ở giữa dãy làm mốc phân hoạch
Khi đó, với l=1 và r=N thì ak là phần tử mốc, với k=(l+r)/2
2 Thuật toán
Bước 1: Phân hoạch dãy al , a l+1 , …, a r thành các dãy con:
Dãy con 1: a l …a j < x
Dãy con 2: a j+1 …a i-1 = x
Dãy con 3: a i a r > x
Trang 154 Độ phức tạp của thuật toán
Hiệu quả của thuật toán phụ thuộc vào cách chọn giá trị khóa x Trường hợp tốt
nhất là mỗi lần phân hoạch chọn được phần tử trung bình - phần tử lớn hơn hay bằng nửa số phần tử và nhỏ hơn hay bằng nửa số phần tử còn lại
Trường hợp xấu nhất là khi phân hoạch một dãy luôn được hai phần, phần thứ nhất
chỉ có một phần tử, trong khi phần còn lại có r-1 phần tử Lúc này cần tới N lần phân
hoạch Độ phức tạp của thuật toán sẽ là O(N2) Trong khi độ phức tạp trong trường hợp
Trang 16tốt nhất của thuật toán là O(log2N)
Độ phức tạp trung bình của thuật toán: O(Nlog2N)
5 Đánh giá
Như cái tên Quick Sort, thuật toán có chi phí trong trường hợp tốt nhất chỉ là log2N Điều này đạt được nhờ kết hợp kỹ thuật chia để trị cùng với đệ quy Có thể nhận thấy những nguyên lý sáng tạo trong thiết kế thuật toán này như sau
- Nguyên lý phân nhỏ
Dãy ban đầu được phân nhỏ thành các dãy con với những đặc trưng riêng biệt phục
vụ cho quá trình sắp xếp Sau đó đến lượt các dãy con được xử lý độc lập, với cùng một cách thức như trên, nghĩa là tăng mức độ phân nhỏ các dãy con Cho đến khi không thể phân nhỏ các dãy con được nữa thì dãy ban đầu đã được sắp thứ tự
- Nguyên lý “tách riêng”
Trong quá trình sắp xếp, phép so sánh là thao tác được thực hiện nhiều nhất, đặc
biệt là so sánh khóa x với các phần tử khác trong dãy Sau khi phân hoạch, các phần tử
có giá trị bằng với khoá x được tách riêng ra, sau đó thì không cần quan tâm đến nữa
như vậy giúp giảm những phép so sánh không cần thiết