Hiện nay trong hầu hết các hệ lưu trữ, quản lý dữ liệu, thao tác tìm kiếm thường được thực hiện nhiều nhất để khai thác thông tin một cách nhanh chóng(ví dụ như : tra cứu từ điển, tìm sách trong thư viện...) và muốn việc tìm kiếm cách nhanh chóng thì dữ liệu cần phải được sắp xếp sẵn, ngăn nắp theo một trật tự, hệ thống nhất định sẽ cho phép chúng ta tìm kiếm nhanh, việc tìm kiếm, sắp xếp có ý nghĩa rất lớn trong việc quản lí và lưu trữ .
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM
Trang 2Do đó khi xây dựng một hệ quản lý thông tin trên máy tính, bên cạnh cácthuật toán tìm kiếm, các thuật toán sắp xếp dữ liệu cũng là một trong những chủ đềđược quan tâm hàng đầu.
Hiện nay đã có nhiều giải thuật tìm kiếm và sắp xếp được xây dựng, mức độhiệu quả của từng giải thuật còn phụ thuộc vào tính chất của cấu trúc dữ liệu cụ thể
mà nó tác động đến mà ta lựa chọn phương pháp sắp xếp sao cho phù hợp Trongkhoa học máy tính và trong toán học, một thuật toán sắp xếp là một thuật toán sắpxếp các phần tử của một danh sách (hoặc một mảng theo thứ tự tăng dần hoặc giảmdần) Người ta thường xét trường hợp các phần tử cần sắp xếp là các số Hầu hếtcác bài toán đều có nhiều thuật toán khác nhau để giải quyết chúng
Nội dung giới thiệu trình bày dưới đây là ba thuật toán sắp xếp thông dụng
và đó cũng là nội dung em nghiên cứu trong đồ án học phần này là:
1 Phương pháp sắp xếp trộn ( Merge sort)
2 Phương pháp sắp xếp nhanh ( Quick sort)
3 Phương pháp sắp xếp kiểu vun đống ( Heap sort) Các thuật toán Merge sort, Quick sort, Heap sort, phức tạp nhưng hiệu suấtcao Các nhóm thuật toán trên đều có một điểm chung là đều được xây dựng dựa
Trang 3trên cơ sở so sánh giá trị của các phần tử trong mảng (hay so sánh các khóa tìmkiếm) Khi xây dựng một thuật toán sắp xếp cần chú ý tìm cách giảm thiểu nhữngphép so sánh và đổi chổ không cần thiết để tăng hiệu quả của thuật toán Vậy nên,
em đã thực hiện đồ án “Tìm hiểu về thuật toán sắp xếp Merge Sort, Quick Sort,Heap Sort” để tìm hiểu kĩ hơn về các thuật toán này cũng như ưu nhược điểm củanó
Em cũng xin chân thành cảm ơn TS Trần Văn Hưng đã trực tiếp chỉ bảo vàhướng dẫn em suốt quá trình hoàn thành khóa luận này Và em cũng xin chânthành cảm ơn các thầy cô Khoa Tin học đã nhiệt tình giúp đỡ và đào tạo em trongthời gian vừa qua
Em xin trân trọng cảm ơn!
Đà Nẵng, ngày tháng 12 năm 2020
Sinh viên thực hiện
Trương Lê Minh Hải
Trang 4Ý KIẾN CỦA GIẢNG VIÊN HƯỚNG DẪN
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Đà Nẵng,ngày tháng 12 năm 2020
Cán bộ hướng dẫn
Trang 5MỞ ĐẦU
1 Lý do chọn đề tài.
Quá trình 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điển hình như là một dãy số nào đó, một dãy chữ theo thứ tự của từ điển.v.v., nhằmsắp xếp theo một thứ tự nhất định theo thứ tự tăng dần (hoặc giảm dần) đối với mộtdãy số, thứ tự từ điển đối với một dãy chữ.v.v…
Bài toán sắp xếp thường được xuất hiện thường xuyên nhất trong các ứngdụng tin học như trong ngôn ngữ nhiều ngôn ngữ lập trình, với những yêu cầu,mục đích khác nhau thì sắp xếp dữ liệu lưu trữ trong máy tính theo cách và cácbước khác nhau….Nói chung, dữ liệu có thể xuất hiện dưới nhiều dạng khác nhau
và thường phải lưu trữ một khối lượng dữ liệu đáng kể, nên việc xây dựng các giảithuật sắp xếp sẽ cho phép tìm kiếm nhanh sẽ có ý nghĩa rất lớn Từ các vấn đề nêu
trên giúp cho em hiểu rõ mục đích đề tài là: để sắp xếp các dãy số theo một trật tự,
thứ tự tăng dần (hoặc là giảm dần) tùy theo vào yêu cầu của người muốn sắp xếp,sắp xếp theo thự tự để giúp cho việc tìm kiếm được dễ dàng hơn, qua đó có thểgiúp em hiểu rõ các ưu khuyết điểm của các phương pháp sắp xếp để so sánh tốc
độ sắp xếp, từ đó để vận dụng các phương pháp đó trong việc sắp xếp theo yêu cầucùa bài toán đặt ra một cách có hiệu quả và đó cũng là mục đích mà em chọn đề tài
về các thuật toán sắp xếp để nghiên cứu
Hiện nay, có nhiều loại thuật toán sắp xếp được xây dựng nhưng em sẽ đi
xếp nhanh (Quicksort), sắp xếp trộn (Mergesort)
2 Mục tiêu nghiên cứu
- Tìm hiểu phân tích khái niệm 3 thuật toán sắp xếp
- Nhận xét chỉ ra ưu điểm và nhược điểm của từng thuật toán
- Đưa ra đề xuất sử dụng các thuật troán trong từng trường hợp cụ thể
- Nghiên cứu và so sánh tốc độ giải thuật của các thuật toán sắp xếp
- Mô phỏng cụ thể các thuật toán
Trang 63.Đối tượng nghiên cứu
Nghiên cứu về các vấn đề sau:
- Tìm hiểu và vận dụng các lý thuyết cơ bản về 3 thuật toán sắp xếp:
- Mô phỏng các thuật toán trên
4 Phương pháp nghiên cứu
- Tổng hợp, phân tích các kết quả nghiên cứu trước đây từ đó rút ra, tìm ra cácvấn đề cần phải giải quyết và đút rút các phương pháp giải quyết vấn đề
- Tìm các phương pháp mở rộng bài toán, cải tiến, xây dựng các thuật toán mới để giải quyết các vấn đề đặt ra
- Từ thực nghiệm đến chứng minh bằng phương pháp toán học để chỉ ra tính vượt trội của cấu trúc mới, thuật toán mới
một dãy số có thứ tự theo các thuật toán sắp xếp vừa nêu trên
5 Bố cục đề tài
Chương1: Một số kiến thức cơ sở
Chương 2: Nội dung về thuật toán sắp xếp
1 Thuật toán sắp xếp trộn ( Merge sort)
2 Thuật toán sắp xếp nhanh ( Quick sort)
Trang 7 Đánh giá thuật toán
3 Thuật toán sắp xếp kiểu vun đống ( Heap sort)
Chương 3: Mô phỏng thuật toán
1 Mô phỏng thuật toán sắp xếp trộn ( Merge sort)
2 Mô phỏng thuật toán sắp xếp nhanh ( Quick sort)
3 Mô phỏng thuật toán sắp xếp kiểu vun đống ( Heap sort)Phần III: Kết luận
Trang 8CHƯƠNG 1: MỘT SỐ KIẾN THỨC CƠ SỞ 1.1 Thuật toán
1.1.1 Khái niệm thuật toán
Thuật ngữ “algorithm” (thuật toán hoặc còn gọi là giải thuật) được gọi theo tên nhà toán học Ả rập thế kỷ IX al-Khowarizmi, người đã viết cuốn sách về các
chữ số Hindu – cơ sở của kí hiệu số thập phân hiện đại (xem [4], trang 118) Xuất
xứ ban đầu là từ algorism, được dùng để chỉ các quy tắc thực hiện các phép tính số học trên các số thập phân Sau đó, vào thế kỷ XVIII algorism biến thành
algorithm Với sự quan tâm ngày càng tăng đối với máy tính, khái niệm thuật toán
đã được cho một ý nghĩa chung hơn, bao hàm cả các thủ tục xác định để giải cácbài toán, chứ không phải chỉ là thủ tục để thực hiện các phép tính số học
Thuật toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tựxác định sao cho sau khi thực hiện dãy các thao tác ấy, từ Input của bài toán tanhận được Output cần tìm
Cũng có thế xem thuật toán như một công cụ để giải quyết một bài toán cụthể Phát biểu bài toán sẽ chỉ định tổng quát mối quan hệ Input/Output cần thiết.Thuật toán mô tả một thủ tục tính toán cụ thể để đạt được mối quan hệInput/Output đó
Vào khoảng những năm 1930 - 1936, lần lượt các nhà toán học K.Gödel,
S Kleene, A Church, A Turing đã đề ra một số định nghĩa khác nhau cho kháiniệm thuật toán Trong số các định nghĩa toán học khác nhau (nhưng tương đương)
về thuật toán, các khái niệm Máy Turing (1937) và Hàm đệ quy (1931-1936) được
sử dụng rộng rãi hơn vì có nhiều thuận tiện cho các nghiên cứu cả về lí thuyết lẫnthực hành
Trang 91.1.2 Các đặc trưng của thuật toán
Các thuật toán có một số tính chất chung, đó là:
định
giá trị đầu ra Các giá trị đầu ra chính là nghiệm của bài toán
chính xác
mỗi tập giá trị đầu vào
hữu hạn (có thể rất lớn) các bước thực hiện đối với mỗi tập đầu vào
chính xác và trong một khoảng thời gian chấp nhận được
đầu vào của bài toán, chứ không phải chỉ cho một tập đặc biệt các giátrị đầu vào
1.2 Độ phức tạp của thuật toán
Cần chú ý rằng mỗi thuật toán chỉ giải một lớp bài toán nào đó, nhưng cóthể có nhiều thuật toán khác nhau giải cùng một bài toán Một vấn đề đặt ra là tacần chọn một thuật toán tốt để giải bài toán đã cho
Nhưng thế nào là thuật toán tốt? Thước đo hiệu quả là thời gian máy tính sửdụng để giải bài toán theo thuật toán đang xét khi các giá trị đầu vào có kích thướcxác định, và dung lượng bộ nhớ đòi hỏi để thực hiện thuật toán đó Như vậy khi
Trang 10xem xét đến độ phức tạp tính toán của thuật toán ta phải xem xét đến độ phức tạp
thời gian và độ phức tạp không gian
Độ phức tạp không gian gắn liền với cấu trúc dữ liệu cụ thể được dùng để
thực hiện thuật toán
Các thuật ngữ thường dùng cho độ phức tạp của thuật toán:
O(n!): Độ phức tạp giai thừa
1.3 Định nghĩa về bài toán sắp xếp:
1.3.1 Khái niệm về sắp xếp:
Trang 11Sắp xếp là quá trình xử lý một danh sách các phần tử (hoặc các mẫu tin) đểđặt chúng theo các thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thôngtin lưu giữ tại mọi phần tử.
Tại sao cần phải sắp xếp các phần tử thay vì để nó ở dạng tự nhiên (chưa cóthứ tự vốn có? Ví dụ của bài toán tìm kiếm với phương pháp tìm kiếm nhị phân vàtuần tự để trả lời câu hỏi này
Khi khảo sát bài toán sắp xếp, ta sẽ phải làm việc nhiều với một khái niệmgọi là nghịch thế
1.3.2.Khái niệm nghịch thế :
Xét một mảng các số a0,a1, …, an Nếu có i < j và ai > aj, thì ta gọi đó là mộtnghịch thế
Cho trước một dãy số a1,a2, …, an được lưu trữ trong cấu trúc dữ liệu mảng
Trang 12trong dãy, cần dựa vào kết quả của một loạt phép so sánh Chính vì vậy, hai thaotác so sánh và gán là các thao tác cơ bản của hầu hết các thuật toán sắp xếp.
Khi xây dựng một thuật toán sắp xếp cần chú ý tìm cách giảm thiểu nhữngphép so sánh và đổi chổ không cần thiết để tăng hiệu quả của thuật toán Đối vớicác dãy số được lưu trữ trong bộ nhớ chính, nhu cầu tiết kiệm bộ nhớ được đặtnặng, do vậy những thuật toán sắp xếp đòi hỏi cấp phát thêm vùng nhớ để lưu trữdãy kết quả ngoài vùng nhớ lưu trữ dãy số ban đầu thường ít được quan tâm Thayvào đó, các thuật toán sắp xếp trực tiếp trên dãy số ban đầu – gọi là các thuật toánsắp xếp tại chổ - lại được đầu tư phát triển Phần này giới thiệu một số giải thuậtsắp xếp từ đơn giản đến phức tạp có thể áp dụng thích hợp cho việc sắp xếp nội
Trang 13CHƯƠNG 2: NỘI DUNG VỀ THUẬT TOÁN SẮP XẾP 2.1 Phương pháp sắp xếp vun đống (Heap Sort)
Giả sử dữ liệu cần sắp xếp là dãy số : 5 2 6 4 8 1 được bố trí theo quan hệ so sánh và tạo thành sơ đồ dạng cây như sau :
Trong đó một phần tử ở mức i chính là phần tử lớn trong cặp phần tử ở mức i+1,
do đó phần tử ở mức 0 (nút gốc của cây) luôn là phần tử lớn nhất của dãy
Nếu loại bỏ phần tử gốc ra khỏi cây (nghĩa là đưa phần tử lớn nhất về đúng
vị trí), thì việc cập nhật cây chỉ xảy ra trên những nhánh liên quan đến phần tử mớiloại bỏ, còn các nhánh khác được bảo toàn, nghĩa là bước kế tiếp có thể sử dụng lạicác kết quả so sánh ở bước hiện tại
Trong ví dụ trên ta có :
Trang 14Loại bỏ 8 ra khỏi cây và thế vào các chỗ trống giá trị -∞ để tiện việc cập nhật lại cây :
Tiến hành nhiều lần việc loại bỏ phần tử gốc của cây cho đến khi tất cả các phần tử của cây đều là -∞, khi đó xếp các phần tử theo thứ tự loại bỏ trên cây sẽ có dãy đã sắp xếp Trên đây là ý tưởng của giải thuật sắp xếp cây
2.1.2 Cấu trúc dữ liệu Heap
Tuy nhiên, để cài đặt thuật toán này một cách hiệu quả, cần phải tổ chức một
cấu trúc lưu trữ dữ liệu có khả năng thể hiện được quan hệ của các phần tử trong cây với n ô nhớ thay vì 2n-1 như trong ví dụ
Khái niệm heap và phương pháp sắp xếp Heapsort do J.Williams đề xuất đã giải quyết được các khó khăn trên
Trang 15Tính chất 3: Mọi dãy a1, a2, …, ar với 2l > r là một heap.
2.1.3 Giải thuật Heap Sort
- Giải thuật hepsort trải qua hai giai đoạn:
Giai đoạn 1: Hiệu chỉnh dãy số ban đầu thành heap;
Giai đoạn 2: Sắp xếp dãy số dựa trên heap :
Bước 1: Đưa phần tử nhỏ nhất về vị trí đúng ở cuối dãy :
r : = n ; Hoán vị (a 1, ar);
Bước 2: Loại bỏ phần tử nhỏ nhất ra khỏi heap : r : = r – 1;
Hiệu chỉnh phần còn lại của dãy từ a1, a2, …, ar thành một heap
Bước 3: Nếu r > 1 (heap còn phần tử): Lặp lại bước 2 Ngược
lại :Dừng
- Ví dụ :Cho dãy số a : 12 2 8 5 1 6 4 15
Trang 16Giai đoạn 1 : Hiệu chỉnh dãy ban đầu thành heap
Trang 17Giai đoạn 2: Sắp xếp dãy số dựa trên heap :
Thực hiện tương tự cho r =5, 4, 3, 2 ta được :
Trang 182.1.4 Đánh giá giải thuật
Trong giai đoạn sắp xếp ta cần thực hiện n-1 bước mỗi bước cần nhiều nhất là log2(n-1), log2(n-2), … 1 phép đổi chỗi
2.1.5 Lưu đồ thuật toán
2.1.5.1 Hiệu chỉnh Heap :
Trang 192.1.5.2 Sắp xếp vun đống:
Trang 202.2 Phương pháp sắp xếp nhanh (Quick sort)
2.2.1 Giải thuật
Để sắp xếp dãy a1, a2, …, an giải thuật Quick sort dựa trên việc phân hoạch dãy ban đầu thành 2 phần:
Dãy con 1: Gồm các phần tử a1 ai có giá trị không lớn hơn x
Dãy con 2: Gồm các phần tử ai an có giá trị không nhỏ hơn x
Với x là giá trị của một phần tử tùy ý trong dãy ban đầu Sau khi thực hiện phân hoạch, dãy ban đầu được phân thành 3 phần :
1 ak < x , với k = 1 i
2 ak = x , với k = i j
3 ak > x , với k = j n
Trang 21
Trong đó, dãy con thứ 2 đã có thứ tự, nếu các dãy con 1 và 3 chỉ có một phần tử thìchúng cũng đã có thứ tự, khi đó dãy ban đầu đã được sắp Ngược lại, nếu các dãy con 1 và 3 có nhiều hơn một phần tử thì dãy ban đầu chỉ có thứ tự khi các dãy con
1 và 3 được sắp Để sắp xếp dãy con 1 và 3, ta lần lượt tiến hành việc phân hoạch từng dãy con theo cùng phương pháp phân hoạch dãy ban đầu vừa trình bày
2.2.1.1 Giải thuật phân hoạch dãy al, al+1, , ar thành hai dãy con
Bước 1: Chọn tùy ý một phần tử a[k] trong dãy là giá trị mốc, l < k < r: x : = a[k]; i:=l; j : = r ;
Bước 2: Phát hiện và hiệu chỉnh cặp phần tử a[i], a[j] nằm sai chỗ :
Bước 2a: Trong khi (a[i] < x) i : = i+1;
Bước 2b: Trong khi (a[j] > x) j : = j-1;
Bước 2c: Nếu i < j // a[i] > x > a[j] mà a[j] đứng sau a[i] thì hoán vị
(a[i],
a[j]);
Nếu i > j : Dừng
2.2.1.2 Giải thuật phân hoạch dãy sắp xếp dãy al , al+1, …, ar
Có thể phát biểu giải thuật sắp xếp một cách đệ quy như sau :
Bước 1: Phân hoạch dãy a1 ar thành các dãy con :
Dãy con 1 : a 1 aj <x
Dãy con 2: a j+1 ai-1 = x
Dãy con 1: a i ar >x
Phân hoạch dãy a1 aj
Trang 22Nếu (i < r) // dãy con 3 có nhiều hơn 1 phần tử Phân hoạch dãy ai ar
Ví dụ : Cho dãy số a : 12 2 8 5 1 6 4 15
Phân hoạch đoạn l =1, r = 8, x =A[4]=5
Phân hoạch đoạn l =1, r = 3, x =A[2]=2
Phân hoạch đoạn l =5, r = 8, x =A[6]=6
Trang 23Cài đặt
2.2.2 Đánh giá giải thuật
Hiệu quả thực hiện của giải thuật Quicksort phụ thuộc vào việc chọn giá trịmốc Trường hợp tốt nhất xảy ra nếu mỗi lần phân hoạch đều chọn được phần tửmedian (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) làm mốc, khi đó dãy được phân chia thành hai phần bằng nhau và
nhằnm phần tử có giá trị cực đại (hay cực tiểu) là mốc, dãy sẽ bị phân chia thànhhai phần không đều : một phần chỉ có 1 phần tử, phần còn lại gồm (n-1) phần tử,
do vậy cần phân hoạch n lần mới sắp xếp xong
Trang 24 Ta có bảng tổng kết sau:
2.2.3 Lưu đồ thuật toán
Xem như dãy số cần sắp xếp đã được nhập sẵn:
Trang 252.3 Phương pháp sắp xếp trộn (MergerSort)
2.3.1 Nguyên tắc sắp xếp bằng phép trộn:
- Để sắp xếp dãy a1, a2, ,an, giải thuật MergeSort dựa trên nhận xét sau:
Mỗi dãy a1, a2, ,an bất kỳ đều có thể coi như là một tập hợp các dãy con liên tiếp mà mỗi dãy con đều đã có thứ tự Ví dụ: 12, 2, 8, 5, 1, 6, 4, 15 có thể coi như gồm 5 dãy con không giảm (12); (2,8); (1,6); (4,5)
Dãy đã có thứ tự coi như có một dãy con
Như vậy, một cách tiếp cận để sắp xếp dãy là tìm cách làm giảm dãy con không giảm của nó Đây chính là hướng tiếp cận của thuật toán sắp xếp theo phương pháptrộn
- Trong phương pháp MergeSort, mấu chốt của vấn đề là cách phân hoạchdãy ban đầu thành các dãy con Sau khi phân hoạch xong, dãy ban đầu sẽ tách rathành 2 dãy phụ theo nguyên tắc phân phối đều luân phiên Trộn từng cặp dãy concủa hai dãy phụ thành một dãy con của dãy ban đầu, ta sẽ nhận lại dãy ban đầunhưng với số lượng dãy con ít nhất giảm đi một nửa Lặp lại qui trình trên sau một
số bước, ta sẽ nhận lại được một dãy chỉ gồm 1 dãy con không giảm Nghĩa là dãyban đầu đã được sắp xếp
2.3.2 Giải thuật
- Giải thuật trộn trực tiếp là phương pháp đơn giản nhất Việc phân hoạch thànhcác dãy con đơn giản chỉ là tách dãy n phẩn tử thành n dãy con Đòi hỏi của thuậttoán về tính có thứ tự của các dãy con luôn được thõa trong cach1 phân hoạch này
vì dãy gồm một phần tử luôn có thứ tự Cứ mỗi lần tách rồi trộn, chiều dài của cácdãy con sẽ được nhân đôi
- Các bước thực hiện thuật toán như sau:
Bước 1: // Chuẩn bị
k = 1; // k là chiều dài của dãy con trong bước thực hiện