1. Trang chủ
  2. » Giáo Dục - Đào Tạo

nghiên cứu và cài đặt chương trình thực hiện 6 giải thuật sắp xếp select sort insert sort bubble sort merge sort quick sort heap sort để sắp xếp dãy số theo chiều giảm dần

35 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Nội dung

Trang 1

TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN********************************************

BÀI TẬP LỚN

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

Đề tài 8: Nghiên cứu và cài đặt chương trình thực hiện 6 giải thuật

sắp xếp (Select Sort, Insert Sort, Bubble Sort, Merge Sort, Quick Sort, Heap Sort) để sắp xếp dãy số theo chiều giảm dần.

Lớp: TIHT1101(123)_04Giảng viên: Lê Minh Tuấn

Hà Nội – 2023

Trang 3

MỤC LỤC

CHƯƠNG I: GIỚI THIỆU PHÁT BIỂU ĐỀ TÀI 5

CHƯƠNG II: NỘI DUNG ĐỀ TÀI 7

I GIẢI THUẬT SẮP XẾP CHỌN (SELECT SORT) 7

II GIẢI THUẬT SẮP XẾP CHÈN (INSERT SORT) 10

III GIẢI THUẬT SẮP XẾP NỔI BỌT (BUBBLE SORT) 13

IV GIẢI THUẬT SẮP XÉP TRỘN (MERGE SORT) 17

V GIẢI THUẬT SẮP XẾP NHANH (QUICK SORT) 23

VI GIẢI THUẬT SẮP XẾP VUN ĐỐNG ( HEAP SORT ) 27

CHƯƠNG III: ĐÁNH GIÁ KẾT QUẢ NGHIÊN CỨU 33

Trang 4

LỜI MỞ ĐẦU

Trong thời đại công nghiệp 4.0 ngày nay, xử lý và sắp xếp dữ liệu đóng một vai tròquan trọng trong nhiều lĩnh vực của khoa học máy tính và công nghệ thông tin Trongsố đó, các thuật toán sắp xếp đóng vai trò then chốt trong việc tối ưu hóa thời gian vàtài nguyên khi xử lý các tập dữ liệu lớn Đặc biệt, nghiên cứu và triển khai 6 giải thuậtsắp xếp nổi tiếng: Select Sort, Insert Sort, Bubble Sort, Merge Sort, Quick Sort, vàHeap Sort để sắp xếp dãy số theo chiều giảm dần đều là những nhiệm vụ quan trọng vàhấp dẫn Mục tiêu của đề tài này là tìm hiểu, phân tích, và triển khai các giải thuật sắpxếp nói trên, với việc tập trung vào việc sắp xếp các dãy số theo thứ tự giảm dần Quaquá trình nghiên cứu và cài đặt, chúng ta sẽ đánh giá hiệu suất của mỗi giải thuật trongcác điều kiện khác nhau và hiểu rõ về cách mỗi giải thuật hoạt động Ngoài ra, việc tìmhiểu và so sánh các giải thuật này sẽ cung cấp cái nhìn sâu sắc về hiệu suất và ứngdụng thực tế của chúng trong các tình huống khác nhau Điều này có thể hỗ trợ lựachọn và triển khai giải thuật sắp xếp phù hợp với nhu cầu cụ thể của ứng dụng hoặc hệthống cụ thể Cuối cùng, thông qua đề tài này, chúng ta hy vọng đưa ra những nhậnthức quan trọng về tầm quan trọng của sắp xếp dữ liệu và ứng dụng của các giải thuậtsắp xếp trong việc tối ưu hóa hiệu suất và tài nguyên trong lĩnh vực công nghệ thôngtin.

Trang 5

CHƯƠNG I: GIỚI THIỆU PHÁT BIỂU ĐỀ TÀI

1 Phát biểu đề tài:

Một trong những vấn đề nền tảng của khoa học máy tính là sắp xếp một tập hợpcác phần tử theo thứ tự cho trước nào đó.Và dữ liệu trong hệ thống thường không đượcsắp xếp theo một trật tự nhất định, vì vậy việc khai thác thông tin sẽ gặp khó khăn khicần thiết.

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ểnhì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ằm sắp xếptheo một thứ tự nhất định theo thứ tự tăng dần (hoặc giảm dần) đối với một dã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 ứng dụng tinhọc như trong ngôn ngữ lập trình Pascal , 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ác bướ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ốilượng dữ liệu đáng kể, nên việc xây dựng các giải thuật sắp xếp sẽ cho phép tìm kiếmnhanh sẽ có ý nghĩa rất lớn Từ các vấn đề nêu trên giúp cho chúng 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ảmdầ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 choviệc tìm kiếm được dễ dàng hơn, qua đó có thể giúp chúng 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ácphương pháp đó trong việc sắp xếp theo yêu cầu của bài toán đặt ra một cách có hiệuquả và đó cũng là mục đích mà nhóm chúng em chọn đề tài về các thuật toán sắp xếpđể nghiên cứu.

Trang 6

2 Phạm vi nghiên cứu

Tìm hiểu và vận dụng các lý thuyết cơ bản về một số phương pháp sắp xếp nhưphương pháp chọn trực tiếp (Selectsort), chèn trực tiếp (Insertsort), sắp xếp nổi bọt(Bubblesort), sắp xếp kiểu vun đống (Heapsort), sắp xếp nhanh (Quicksort), sắp xếptrộn (Mergesort) để cài đặt chương trình các giải thuật , cho phép sắp xếp một dãy sốđã cho tuỳ ý thành 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.

3 Đối tượng

Giải thuật và chương trình cài đặt các thuật toán giải thuật sắp xếp· Select sort

· Insert sort· Bubble sort· Merge sort· Quick sort· Heap sort

4 Mục đích nghiên cứu

Để 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 theovà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 chúng em hiểu rõ các ưu khuyết điểm của cácphươ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ầu của bài toán đặt ra một cách có hiệu quả.

Trang 7

CHƯƠNG II: NỘI DUNG ĐỀ TÀI

I GIẢI THUẬT SẮP XẾP CHỌN (SELECT SORT)

1 Lý thuyết thuật toán

a Khái niệm

Thuật toán sắp xếp chọn (Select Sort) là sắp xếp một mảng bằng cách đi tìm phần tử có giá trị lớn nhất (giả sử với sắp xếp mảng giảm dần) trong dãy số chưađược sắp xếp và đổi chỗ cho phần tử nhỏ nhất đó với phần tử ở đầu dãy chưa được sắp xếp (không phải đầu mảng) Thuật toán sẽ chia mảng ra làm 2 mảng con:

- Mảng con đã được sắp xếp- Mảng con chưa được sắp xếp

Tại mỗi bước lặp của thuật toán, phần tử nhỏ nhất ở mảng con chưa được sắp xếp sẽ được di chuyển về đoạn đã được sắp xếp.

b Ý tưởng

Giả sử cần sắp xếp tăng dần một danh sách có n phần tử: a0, a1, a2,…, an-1 Chọn phần tử lớn nhất trong n phần tử của danh sách ban đầu Tìm và đổi vị trí phần tử lớn nhất với phần tử đầu tiên trong danh sách Lúc này, phần tử a0 sẽ có giá trị lớn nhất trong danh sách.

Sau đó, xem danh sách cần sắp xếp hiện tạo chỉ gồm n-1 phần tử, bắt đầu từ phần tử thứ 2 trong danh sách ban đầu, tức là danh sách hiện tại chỉ gồm a1, a2,…, an-1 Lặp lại quá trình trên cho danh sách hiện tại đến khi danh sách chỉ còn 1phần tử.

c Các bước thực hiện- Bước 1: Gán i = 0

- Bước 2: Tìm phần tử a[max] trong dãy từ a[i] đến a[n-1]- Bước 3: Đổi chỗ a[max] và a[i]

- Bước 4: Nếu i < n-1 thì gán i = i + 1, rồi lặp lại bước 2, ngược lại thì dừngd Ví dụ minh họa

- Dãy số ban đầu là

- Chọn phần tử lớn nhất và hoán đổi vị trí với phần tử đầu dãy

- Vị trí đầu tiên đã được sắp xếp, dãy 22, 25, 12, 11 là dãy chưa được sắp xếp

11

Trang 8

- Chọn tiếp phần tử lớn nhất và phần tử đầu tiên ở mảng chưa được sắp xếp

- Đổi vị trí phần tử lớn nhất và phần tử đầu dãy chưa được sắp xếp

- Chọn tiếp phần tử lớn nhất ở dãy 22, 12, 11

- Ta thấy 22 là số lớn nhất và trùng vị trí đầu tiên nên không hoán đổi

- Tiếp tục thực hiện với hai phần tử cuối, thu được dãy số cuối cùng:

2 Code (Bài làm sử dụng ngôn ngữ C++)

a Code

- Hàm sắp xếp chọn:

- Hàm in mảng:

64

Trang 9

- Hàm main:

a Ví dụ chạy thử:- Mẫu test:

11 22 25 12 64 64 25 22 12 11- Kết quả test:

3 Tổng kết

a Thời gian tính toán và độ phức tạp

- Độ phức tạp của thuật toán Select Sort là O(n2) bởi có hai vòng lặp lồng nhau:+ Một vòng lặp để chọn từng phần tử của mảng: O(n)

+ Một vòng lặp khác để so sánh phần tử đó với các phần tử khác của mảng: O(n)

Trang 10

 Vì vậy, độ phức tạp tính toán là: O(n) * O(n) = O(n*n) = O(n2)

- Không gian nhớ hỗ trợ: O(1) – là bộ nhớ bổ sung duy nhất được sử dụng cho các biến tạm thời trong khi hoán đổi hai giá trị trong mảng.

b Ưu điểm, nhược điểm của thuật toán- Ưu điểm:

+ Đơn giản, dễ hiểu

+ Thực hiện tốt với dãy dữ liệu nhỏ.- Nhược điểm:

+ Không hiệu quả khi làm việc với dãy dữ liệu lớn

+ Không bảo toàn thứ tự tương đối của các mục có khóa bằng nhau, nó không ổn định.

c Ứng dụng:

- Select Sort có nhiều ứng dụng thực tế, đặc biệt trong những viễn cảnh mà sự đơn giản được ưa chuộng trong trình bày hoặc với dãy dữ liệu nhỏ Ví dụ:+ Sắp xếp một dãy học sinh theo lớp học hoặc tên trong một lớp học nhỏ.+ Tổ chức các tệp trong một thư mục theo này tạo hoặc kích thước của chúng.+ Sắp xếp một bộ bài theo thứ tự tăng dần hoặc giảm dần.

II GIẢI THUẬT SẮP XẾP CHÈN (INSERT SORT)

1 Lý thuyết thuật toán

a Khái niệm

Insertion sort là một thuật toán sắp xếp, ta hiểu thuật toán này như sắp xếp những lá bài Ta sẽ chia bộ bài ra 2 phần là phần đã được sắp xếp (sorted list) vàphần chưa được sắp xếp (unsorted list) Bắt đầu, phần đã được sắp xếp chỉ chứa giá trị đầu tiên của mảng, phần chưa được sắp xếp chứa tất cả các giá trị còn lại Việc sau đó là chuyển từng phần tử từ phần chưa được sắp xếp vào vị trí đúng trong phần đã được sắp xếp.

b Ý tưởng sử dụng insert sort để sắp xếp dãy khóa theo chiều giảm dần

- Bước 1: Chọn bắt đầu từ khóa thứ 2, (vì khóa thứ nhất đã nằm trong phần đã được sắp xếp) Ta so sánh khóa hiện tại với các khóa trong phần đã sắp xếp.- Bước 2: Nếu khóa chọn lớn hơn khóa đang so sánh, dịch chuyển khóa đang so

sánh về phía sau một vị trí (sang phải) Tiếp tục quá trình này cho đến khi tìm được vị trí mà khóa chọn không còn lớn hơn khóa tại vị trí đó hoặc đã duyệt hết phần đã sắp xếp.

- Bước 3: Chèn khóa hiện tại vào vị trí trống.

- Bước 4: Lặp lại quá trình cho tất cả các khóa trong phần chưa sắp xếp.c Ví dụ minh họa:

Giả sử chúng ta có dãy khóa sau: 32,19,26,36,44,41

Trang 11

khóa đã được sắp xếp khóa chưa được sắp xếpMinh họa bởi bảng sau:

Với bảng trên ta đã thực hiện:

- Coi dãy khóa được sắp xếp ban đầu là 32 Dãy chưa được sắp xếp là 19, 26, 36, 44, 41.

- Chọn khóa mang giá trị 19 và so sánh với dãy khóa được sắp xếp và chèn vào vịtrí thích hợp (ở trường hợp này ta giữ nguyên vị trí) Ta được kết quả là:

- Chọn khóa mang giá trị là 26 và so sánh với dãy khóa đã được sắp xếp Ta thấy 19<26 nên dịch khóa 19 sang phải, hết khóa nhỏ hơn nên ta chèn 26 vào trước 19 sau 32 Ta thu được:

- Ta lặp đi lặp lại tới khi không còn khóa nào trong dãy chưa được sắp xếp thì thuđược kết quả cuối cùng:

4441363226192 Phần code C++ insert sort theo chiều giảm dần

a Code

- Hàm insertionSort() – Thuật toán Insert Sort

Trang 12

- Hàm printArray() – in mảng sau khi sắp xếp

- Hàm main

b Ví dụ chạy thử:- Mẫu test:

Trang 13

1 2 3 4 5 5 4 3 2 1- Kết quả test:

b Nhận xét về ưu và nhược điểm

- Thuật toán này là một trong những thuật toán đơn giản nhất với cách thực hiện đơn giản Khi số lượng phần tử nhỏ, thuật toán này hoạt động rất hiệu quả Nếudữ liệu đã được sắp xếp gần như hoàn toàn, Insertion Sort có thể hoạt động trong thời gian tuyến tính (O(n)) Sắp xếp chèn có bản chất thích ứng, tức là nó thích hợp cho các tập dữ liệu đã được sắp xếp một phần.

- Khi số lượng phần tử lớn, thuật toán này không hiệu quả vì độ phức tạp thời gian của nó là O(n^2) Nếu dữ liệu thay đổi liên tục, thuật toán này có thể khôngphù hợp vì nó cần phải chạy lại mỗi khi dữ liệu thay đổi.

III.GIẢI THUẬT SẮP XẾP NỔI BỌT (BUBBLE SORT)

1 Lý thuyết thuật toán

a Khái niệm

Bubble Sort là thuật toán sắp xếp đơn giản nhất hoạt động bằng cách hoán đổi nhiều lần các phần tử liền kề nếu chúng không đúng thứ tự Thuật toán này không phù hợp với các tập dữ liệu lớn vì độ phức tạp thời gian trung bình và trường hợp xấu nhất của nó là khá cao.

b Ý tưởng

Dãy các khoá cần sắp xếp được duyệt từ dưới lên , nếu trên đường đi gặp 2 khoákế cần ngược chiều nhau thì sắp xếp đổi chỗ hai khoá cho nhau Như vậy, sau khi j lượt thì j khoá nhỏ hơn lần lượt được sắp xếp vào các vị trí thứ 1, vị trí thứ 2, thứ j.Quá trình được lặp lại cho đến khi tất cả các khoá trong dãy được sắp xếp vào

Trang 14

đúng vị trí Nếu ta hình dung dãy khoá được đặt thẳng đứng thì ta thấy rằng các khoá nhỏ hơn sẽ được nổi dần lên đầy dãy khoá , giống như hình ảnh “ nổi bọt” củasiêu nước đang sôi , nên còn được gọi là giải thuật sắp xếp nổi bọt.

c Các bước thực hiện thuật toán sắp xếp nổi bọt

Xét một mảng gồm n số nguyên : a1 ,a2 ,a3 , ,an.Với cách sắp xếp không giảm từ trái qua phải , mục đích của chúng ta là đưa dần các số nhỏ nhất về cuối dãy ( ngoài cùng của bên phải).

- Bước 1: Bắt đầu từ vị trí số 1, xét lần lượt từng cặp 2 phần tử, nếu phần tử bên phải lớn hơn phần từ bên trái, ta sẽ thực hiện đổi chỗ 2 phần tử này , nếu không,xét tiếp cặp tiếp theo Với cách làm như vậy, phần từ lớn hơn sẽ “ nổi” lên, còn phần tử nhỏ hơn sẽ “chìm” dần và về bên phải.

- Bước 2: Khi kết thúc vòng thứ nhất, ta sẽ đưa được phần tử nhỏ nhất về cuối dãy

Sang vòng thứ hai, ta tiếp tục bắt đầu ở vị trí đầu tiên như vậy và đưa được phầntừ nhỏ thứ hai về trị trí thứ 2 cuối dãy , tượng tư như vậy cho đến vòng cuối cùng

d Ví dụ minh họa thuật toán

Ta có một mảng A = [8,6,34,22,11]Minh hoạ bước lặp thứ nhất :

· Đầu tiên lấy 8 so sánh với 6 ta thấy 8 > 6 không thực hiện đổi ví trí

· Tiếp theo lấy 6 so sánh với 34 ta thấy 6 < 34 ta thực hiện đổi vị trí 2 số này.

· Tiếp theo so sánh 22 và 6 , 6 < 22 thực hiện đổi vị trị 2 số này.

· Cuối cùng là so sánh 6 và 11 ta thấy 6 < 11 thực hiện đổi vị trí 2 số này , ta thu được kết quả cuối cùng như sau :

Trang 15

Thực hiện 4 bước lặp liên tiếp ta thu được bảng như sau :

Sau 4 bước lặp ta thu được mảng đã được sắp xếp theo thứ tự giảm dần như sau : A=[34,22,11,8,6]

2 Code (sử dụng ngôn ngữ C++ ) và chạy thử giải thuật bubble sort

a Code

- Hàm sắp xếp

- Hàm in mảng

Trang 16

- Hàm main

b Ví dụ chạy thử - Mẫu test :

a Thời gian tính toán và độ phức tạp

Thấy ngay số phép so sánh là luôn không đổi, tức không phụ thuộc vào tình trạng ban đầu của dãy Với i bất kỳ, ta luôn phải so sánh A[j] với A[j-1], mà j chạy từ n đến i+1, tức ta tốn n-i phép so sánh Thêm nữa, i chạy từ 1 đến n-1 Vậy ta tính được số phép so sánh tổng cộng: ∑(n-i) với i chạy từ 1 đến n-1 = (n-1) + (n-2) + … + 1 = n(n-1)/2.Do đó ta có độ phức tạp tính toán : O(n2).

Trang 17

 Tổng kết lại, ta có độ phức tạp của Bubble Sort thuộc O(n2) trong mọi trường hợp.

b Ưu nhược điểm của thuật toán· Ưu điểm:

+ Là thuật toán cơ bản, dễ hiểu, phù hợp cho người bắt đầu học về sắp xếp.+ Đoạn code ngắn gọn, dễ nhớ.

trong các mảng gần như được sắp xếp và sửa nó chỉ với độ phức tạp tuyến tính (2n) trong đồ hoạ máy tính.

IV GIẢI THUẬT SẮP XÉP TRỘN (MERGE SORT)

1 Lý thuyết thuật toán

a Khái niệm:

- Là một giải thuật có độ phức tạp tính toán ở mức trung bình.

- Giải thuật sử dụng phương pháp chia để trị (Divide and Conquer) giống với giải

thuật sắp xếp nhanh (Quick Sort).b Ý tưởng:

- Cho một mảng các dãy số không theo trật tự, giải thuật chia mảng cần sắp xếp thành 2 nửa.

- Tiếp tục lặp lại việc chia các nửa mảng đã chia ở trên cho đến khi không thể chia nữa (mảng giờ đang rỗng hoặc chỉ có một phần tử).

- Sau cùng, khi các nửa đã được sắp xếp, việc ‘trộn’ (kết hợp) sẽ được thực hiện Quá trình trộn là quá trình lấy 2 mảng nhỏ hơn đã được sắp xếp và kết hợp chúng với nhau và tạo ra một mảng lớn hơn.

Trang 19

39 28 40 5 11 81 13

¯

· Bước 3: Lần lượt kiểm tra vị trí phần tử đầu tiên so với vị trí phần tử cuối cùng của hai mảng vửa nhận được, nếu nhỏ hơn, tìm vị trí phần tử giữa của hai mảng con vừa nhận được.

· Bước 4: Lặp lại các bước ở bước 2 với 2 mảng con ta vừa chia ở trên, ta được 4

Trang 20

· Bước 7: Lần lượt so sánh vị trí đầu tiên và vị trí phần tử cuối của 7 mảng trên, lúc này, vị trí đầu tiên không nhỏ hơn vị trí phần tử cuối của mảng, ta kết thúc quá trình chia.

· Bước 8: So sánh các phần tử cho từng mảng con, và kết hợp chúng thành một mảng lớn hơn theo thứ tự mình mong muốn

¯

Trang 21

¯

2 Code (Bài làm sử dụng ngôn ngữ C++)

a Code

- Hàm merge

Trang 22

- Hàm mergeSort

- Hàm xuất mảng

Ngày đăng: 16/08/2024, 14:57

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w