1. Trang chủ
  2. » Công Nghệ Thông Tin

Tìm hiểu về thuật toán sắp xếp Merge Sort, Quick Sort, Heap Sort và demo chương trình

39 64 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tìm hiểu về thuật toán sắp xếp Merge Sort, Quick Sort, Heap Sort
Tác giả Trương Lê Minh Hải
Người hướng dẫn TS. Trần Văn Hưng
Trường học Đại học Đà Nẵng
Chuyên ngành Khoa Tin học
Thể loại báo cáo đồ án
Năm xuất bản 2020
Thành phố Đà Nẵng
Định dạng
Số trang 39
Dung lượng 1,75 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

Do đó 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 3

trê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 5

MỞ ĐẦ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 6

3.Đố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 8

CHƯƠ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 9

1.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 10

xem 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 11

Sắ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 12

trong 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 13

CHƯƠ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 14

Loạ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 15

Tí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 16

Giai đoạn 1 : Hiệu chỉnh dãy ban đầu thành heap

Trang 17

Giai đ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 18

2.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 19

2.1.5.2 Sắp xếp vun đống:

Trang 20

2.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 22

Nế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 23

Cà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 25

2.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

Ngày đăng: 10/09/2021, 20:41

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w