1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo Cáo Bài Tập Lớn Đề Tài Trình Bày Về Thuật Toán Sắp Xếp Nhanh - Quicksort.pdf

20 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
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

HOC VIEN NGAN HANG

KHOA HE THONG THONG TIN QUAN LY

BAO CAO BAI TAP LON Hoc phan: CAU TRUC DU LIEU VA GIAI THUAT

Đề tài: Trình bày về thuật tốn sắp xếp nhanh - QuickSort

Giáo viên hướng dẫn: Thầy Nguyễn Thanh Thụy

Sinh viên thực hiên: Nhĩm 05 Lớp: K25CNTTA

Ha Noi, Thang 11 nam 2023

Trang 2

HOC VIEN NGAN HANG

KHOA HE THONG THONG TIN QUAN LY

BAO CAO BAI TAP LON

Hoc phan: CAU TRUC DU LIEU VA GIAI THUAT

Dé tai: Trinh bay vé thuat toan sap xép nhanh - QuickSort

Giáo viên hướng dẫn: Thầy Nguyễn Thanh Thuy

Sinh viên thực hiên: Nhĩm 05 Lớp: K25CNTTA STT Ho va Tén MSV Ty lé dong gop

1 Trần Thị Huyền Châm 25A4041527 20%

2 Hồng Đức Duy 25A4041530 20% 3 Ngơ Thị Thu Hà 25A4041538 20%

4 Nguyễn Thu Huyền 25A4041548 20%

5 Vi Thị Phương Thùy 25A4041922 20%

Trang 3

MUC LUC

LOL NOI DAU ooeeeccoccsessssesessssssesssossesetsstesetsvsssstissistssesisussesessissssssessussvesssssessissvesstssvesseees 4

L Lich str hinh thanh cua thuat toan Sap xép nhanh - QuickSort cccccccccceescseeseeeeseeees 5 IL Y trong thudat toan c.ccceccecccccccecsccsvesesecseesvescsseseesessessesessessvsseseceessesecsreessensevstssttevssesees 6 LV OT ene ccc cece cc cennecceseeeeseeeessaeeesseeeesseeesseeeesseeessasesssseesssseessssescsseesenseeeeeees 6 2 Cách chọn phân tử làm cht — pivot: c cccccccccsccsscssescesessessesseseeseesessceeseeecevsveesevsreeseees 7

in in: 1 cccceeceecessssseccccccccccccvsssssstnsttssseeeecececeesecectutaacccecevsesesetttttautesstesecs 7

IV Cài đặt thuật tốn L1 1n HH TH HH TH HT TH K KT ng k ng KĐT n1 1 1x xkt 7

V Minh họa thuật tốn - - 00011 HH1 0 vn g5 01 1 KT ng cv 8 VI Độ phức tạp L0 1201112122111 1 1211121110111 1511511 01k 11H xá kg kh kh 11 1 Độ phức tạp của thuật tốn QuIckSọt c0 1 211122221 1111551157 18 re 11 2 So sánh độ phức tạp với một số thuật tốn - ST ng nn TS TH He Hee 12

VII Tơng kẾT 1 c1 1 22121121111 1121111111 1711110102111 12111121 nen, 13 1 Ưu điểm và nhược điểm của thuật tốn Sắp xếp nhanh 5c cc Ssx cv rsexsri 13

2 Kết luận - - 5-2: 21211221121122112112211211111211211211 211211 re 13 TÀI LIỆU THAM KHẢO - 2 22 21222122122112211211211121122112122121111211212221 2e 15 DANH MỤC HÌNH ẢNH

Hình I: C.A.R Hoare C2227 C02 2n nnnnn nh se so vÐ

Trang 4

LOI NOI DAU

Trong thời đại số hĩa và cơng nghệ thơng tin hiện nay, việc nắm vững và hiệu sâu về các thuật tốn sắp xếp khơng chỉ là một phần quan trọng của kiến thức trong lĩnh vực khoa học máy tính và lập trình mà cịn là chìa khĩa mở cánh cửa cho sự thành cơng trong việc xử lý dữ liệu lớn và tối ưu hĩa hiệu suất hệ thống Bên cạnh đĩ, việc hiểu biết thêm về thuật tốn cũng sẽ trở thành cơng cụ giúp chúng ta trong quá trình tìm kiếm việc làm Với bài tập lớn này, chúng ta sẽ ổi vào tìm hiểu một trong những thuật tốn sắp xếp phố biến và mạnh mẽ nhất — thuật tốn Sắp xếp nhanh hay cịn gọi là QuickSort Bài tập lớn này sẽ đi vào việc tìm hiểu về nguồn gốc hình thành của thuật tốn Sắp xếp nhanh, ý

tưởng và các bước dé chúng ta thực hiện thuật tốn đồng thời cũng đưa ra một cách dé

xây dựng thuật tốn này trên ngơn ngữ lập trình C++ và minh họa các bước hoạt động của

thuật tốn

Như vậy, qua quá trình tìm hiểu về thuật tốn Sắp xếp nhanh, chúng ta sẽ hiểu rõ hơn về cơ sở lý thuyết và từ đĩ tự tìm hiểu cách ứng dụng nĩ để nâng cao khả năng học hỏi và sáng tạo của bản thân, từng bước biến thuật tốn thành cơng cụ hữu ích của mình trong

Trang 5

I Lịch sử hình thành của thuật tốn Sắp xếp nhanh - QuickSort

QuickSort là một thuật tốn sắp xếp (Sorting Algorithm) trong khoa học máy tính được phát triển bởi một nhà khoa học người Anh là Tony Hoare Khi đang học tại Đại học

Quốc gia Moscow, Tony Hoare nhận được một đề nghị làm việc từ Viện Vật lý Quốc gia

(NPL) để tham gia dự án mới về dịch máy từ tiếng Nga sang tiếng Anh Tuy nhiên, vì từ điển được lưu trữ trên băng từ, ơng cần phải sắp xếp các từ trong câu theo thứ tự chữ cai trước khi dịch

Hoare đã nghĩ ra hai phương pháp đề giải quyết vấn đề này Phương pháp đầu tiên sẽ mất thời gian tỷ lệ với bình phương độ dài của câu Phương pháp thứ hai sau này đã biến

thành thuật tốn QuickSort Vào thời điểm đĩ, ơng chí biết một ngơn ngữ lập trình là

Mercury Autocode Thật khơng may, ơng khơng thê viết thành cơng QuickSort bằng Mercury Autocode

Due credit must be paid to the genius of the designers of ALGOL 60 who included recursion in

their language and enabled me to describe my invention so elegantly to the world

(C A R Hoare)

izquotes.com

Hinh 1: C.A.R Hoare

Nam 1961, Hoare tham gia mét khda hoc vé Algol 60 tai Brighton Algol 60 cho phép dé quy (kha năng của một thủ tục gọi chính nĩ) Trong khĩa học này, Hoare da lập trình một thuật tốn sắp xếp siêu nhanh được biết đến ngày nay với tên gọi QuickSort Bài báo đầu tiên về QuickSort của ơng cũng được cơng bố vào năm 1961, va mét bai báo khác được

Trang 6

II Ý tưởng thuật tốn

1 Ý tưởng

Thuật tốn QuickSort là một thuật tốn sắp xếp dãy số trong máy tính dựa trên nguyên tắc chia đề trị Ý tưởng cơ bản của thuật tốn QuickSort là chia máng dữ liệu thành các phần nhỏ hơn, sau đĩ sắp xếp từng phần nhỏ này và kết hợp chúng ta đề tạo ra một mảng được sắp xếp Quá trình chia sẻ và kết hợp quy trình đệ quy cho đến khi sắp xếp mảng hồn chính

Cụ thẻ, trình diễn QuickSort như sau:

Lựa chọn một phần tử từ mảng được gọi là “pivot” Phần tử này sẽ được sử dụng để phân chia mảng thành hai phần: một phần chứa tất cả các phần nhỏ hơn hoặc bằng pivot và một phân chứa tất cả các phân tử lớn hơn pivot

Di chuyên các phần tử trong mảng sao cho các phần tử nhỏ hơn trục nằm bên trái của trục và các phần tử lớn hơn trục nằm bên phải của trục Điều này thường được thực hiện thơng qua một qua trinh goi la “partition” (phan hoạch)

Đệ quy áp dụng thuật tốn QuickSort cho cá hai phần của máng: phần bên trái của pivot và phần bên phải của pivot

Quá trình đệ quy sẽ tiếp tục cho đến khi mỗi phần tử chỉ cịn một phân tử hoặc khơng cĩ

phần tử nào

Khi tất cả các phần tử đã được sắp xếp, mảng gốc cũng đã được sắp xếp

Trang 7

2 Cách chọn phan tir lam chét — pivot: « - Chọn phần tử đầu tiên của mảng ¢ Chon phan tir cuối cùng của mảng « - Chọn phần tử giữa mảng

« - Chọn ngẫu nhiên phân tử trong mảng

LII Thuật tốn:

Trong thuật tốn QuickSort, việc phân hoạch dựa trên các bước sau:

« - Bước l - Chọn tùy ý một phần tử a[k] trong dãy làm phần tử chốt

(left < k < right), xác định hai biến i và j lần lượt bằng phần tử đầu tiên và cuối cùng của danh sách:

Pivot = a[k]; i= left; j = right

« - Bước 2 — Phát hiện và hiéu chinh cap phan tử ai] a[j] nằm sai chỗ: e_ Bước 2a— Trong khi (a[i] < pivot) thi i++;

e_ Bước 2b — Trong khi (a[j] < pivot) thì J ; o_ Bước 2c— Nếu ¡ <j ta đối chỗ a[ï] a[j]:

«ồ Bước 3-Nếu¡ <j, lap lai Bude 2

IV Cài đặt thuật tốn

Dưới đây là thuật tốn Sắp xếp nhanh — QuickSort được biêu diễn bằng ngơn ngữ lập trinh C++:

void quickSort(int a[], int 1, mt r){

int p = a[(+1)/2]; //Xac dinh phan tu chot la phan tu nam giua trong day inti=1,j =r;

while (1 <j){ while (a[i] < p)

{

Trang 8

while (a[j] > p) {

in }

if (i <=j)

{

int temp = afi];

ali] = aly]: a[j] = temp;

i+;

io

} } if(@i<r) { quickSort(a, 1, r); //De quy phan hoach doan nam ben trai phan tu pivot } if (l<j) { quickSort(a, 1, j); //De quy phan hoach doan nam ben phai phan tu pivot }

V, Minh họa thuật tốn

Cho day s6a: 12 2 8 5 16 4 15

Trang 10

Ta co n = 8, tién hanh phan hoach doan left = 0, right = 7, pivot = a[(0+7)/2] =5 Gan i =left = 0, j = right =7

Duyệt ¡ từ left dén right và so sanh i với pivot, nêu i < pivot thì tiếp tục duyệt và ngược lại

tạm dừng 1 Do đĩ 1 dừng lại tại vị trí thử 0 do a[0] = 12 > pivot

Duyét j ttr right đến left và so sánh j với pivot, nêu j > pivot thì tiếp tục duyệt và ngược lại tạm dừng J Do đĩ J dừng lại tại vị trí thử 6 do a[6] = 4 < pivot

Hoan déi cap phan tử a[i] va a[j] tang i và giảm j

0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7

Trang 13

Luc nay, do i > j nên tạm dừng phân hoạch và ¡ =4, j = 2 Xét điều kiện rồi gọi đệ quy phân hoạch lần lượt 2 dãy con a = a[left] a[j] va a2 = ali] a[right] như sau:

Phân hoạch dãy bên trái, chọn 2 lam pivot, thực hiện như trên:

0 1 2 3 4 5 6 7

<4

iS /SĐ ZĐ'Z¬'Z“¬-=¬-=¬>=¬ PIAS SE

0 1 2 3

®@ @@ @ @ ®@œ

Trang 14

Do 2 day con bên phải giá trị 2 chi con 1 phan tt nén coi nhu da duge sap xép

Trang 15

0 1 2 3 4 5 6 7

Trang 16

0 1 2 3 4 5 6 7

Trang 17

Như vậy, sau quá trình sắp xếp ta thu được dãy như trên VỊ Độ phức tạp 1 Độ phức tạp của thuật tốn QuickSort 1.1 Trường hợp tốt nhất: Trong trường hợp tốt nhất của thuật tốn QuickSort, mảng sẽ được chia thành hai phần bằng nhau sau mỗi lần phân đoạn, tức là máng ban đầu sẽ được chia đều đều thành hai mảng con cĩ kích thước gần bằng nhau Khi điều này xảy ra, thuật tốn sẽ hoạt động hiệu quả nhất và đạt được độ phức tạp thời gian tốt nhat la O(n*log(n)) 1.2 Trường họp trung bình: Trường hợp này gần giống với trường hợp tốt nhất, cụ thể như sau: Trong trường hợp trung bình của thuật tốn QuickSort, mảng được phân chia thành hai phần gần bằng nhau sau mỗi lần phân đoạn Tuy nhiên, máng khơng được chia đều mà phụ thuộc vào sự lựa chọn của pIvot Sự lựa chọn của pIvot cĩ thé la ngẫu nhiên hoặc dựa trên một chiến lược nhất định Trong trường hợp này, thuật tốn QuickSort trung bình cĩ độ phức tạp thời gian là O(n*log(n)) 1.3 Trường hợp xấu nhất: Trong trường hợp xấu nhất của thuật tốn QuickSort, máng sẽ được phân chia thành hai phân khơng cân đối sau mỗi lần phân đoạn Khi điều này xảy ra, thuật tốn cĩ độ phức tạp thời gian tệ nhất, 1a O(n’), voi n là kích thước của mảng ban đầu Trường hợp xấu nhất xảy ra khi pivot được chọn một cách xấu, ví dụ như là phần tử nhỏ nhất hoặc lớn nhất trong mang

2 So sánh độ phức tạp với một số thuật tốn

Trang 18

Chọn trực tiếp Nỗi bọt Shaker Sort Chèn trực tiếp Chèn nhị phân Shell Sort Heap Sort VII Tổng kết 1 Ưu điểm và nhược điểm của thuật tốn Sắp xếp nhanh a Uu diém Quick Sort là một trong những thuật tốn sắp xếp nhanh nhất hiện nay, đặc biệt là với các tập dữ liệu lớn Thuật tốn Quick Sort cĩ độ phức tạp trung bình O(n log n) và tốc độ

chạy rất nhanh với các bộ dữ liệu lớn

Thuật tốn Quick Sort cĩ cầu trúc đơn giản, dễ hiểu và dễ triển khai trong các chương trình lập trình Vì vậy, việc cài đặt và sử dụng thuật tốn Quick Sort dễ dàng hơn so với

một sơ thuật tốn sắp xếp khác

Đặc biệt Quick Sort cĩ khả năng sắp xếp trong chính nĩ, khơng cần sử dụng một mảng phụ đề lưu trữ các giá trị trung gian trong quá trình sắp xếp Điều này đã giúp giảm thiểu

việc sử dụng bộ nhớ và tăng hiệu suất

Thuật tốn Quick Sort cĩ thể được tùy biến để phù hợp với nhiều tình huống khác nhau, bằng cách thay đơi cách chọn pivot hoặc cách xử lý các phần tử bị trùng lặp

Thuật tốn Quick Sort hoạt động tốt với các tập dữ liệu nhỏ, đặc biệt là khi sử dụng phiên bản đơn giản của thuật tốn

Trang 19

b Nhuoc diém

Thuật tốn QuickSort cé d6 phic tap thoi gian trong truong hop xau nhat la O(n’), điều này xảy ra khi lựa chọn pivot khơng tốt

Thuật tốn này cũng khơng phải là sự lựa chọn hiệu quả cho các tập dữ liệu nhỏ

Bên cạnh đĩ, QuickSort khơng ốn định Nĩ khơng duy trì thứ tự tương đối của các phần tử cĩ cùng khĩa hoặc giống nhau khi chúng ta sắp xếp vì ta chỉ hốn đối chúng dựa trên vị trí của pivot mà khơng xem xét đến vị trí ban đầu của chúng

2 Kết luận

Trong bài tập lớn này, chúng ta đã tìm hiểu về thuật tốn Quicksort - một trong những thuật tốn sắp xếp hiệu quả và phố biến nhất trong lĩnh vực khoa học máy tính Quicksort khơng chỉ nổi tiếng với hiệu suất cao của mình, mà cịn với tính linh hoạt và dễ triển khai

Chúng ta đã xem xét cách thuật tốn hoạt động, từ việc chia mảng thành các phần nhỏ đến

quá trình sắp xếp các phần này một cách đệ quy

Quicksort sử dụng chiến lược chia để trị, tận dụng việc chọn phân tử chốt (pivot) để đảm bảo rằng các phần tử nhỏ hơn pivot được đặt bên trái và các phần tử lớn hơn pivot được đặt bên phải Điều này tạo ra một cách tiếp cận hiệu quả đề sắp xếp mảng một cách nhanh chĩng

Tuy nhiên, cũng cần lưu ý rằng Quicksort cĩ thể trở nên khơng hiệu quả trong trường hợp xấu nhất khi mảng đã sắp xếp hoặc gần sắp xếp Điều này đặt ra thách thức trong việc chọn pivot và yêu cầu sự cân nhắc trong triển khai

Trong quá trình nghiên cứu và triển khai thuật tốn Quicksort, chúng ta đã hiểu rõ hơn về

cách thiết kế thuật tốn hiệu quả và cách áp dụng nĩ vào thực tế Đồng thời, bài tập lớn cũng cung cấp cơ hội để nâng cao kỹ năng lập trình và khả năng phân tích hiệu suất của

thuật tốn

Tổng kết, việc năm vững Quicksort khơng chỉ mở ra cánh cửa cho việc hiểu sâu về sắp xếp mảng, mà cịn giúp chúng ta phát triển khả năng giải quyết vấn đề và tư duy lập trình Quicksort khơng chỉ là một cơng cụ quan trọng trong lĩnh vực khoa học máy tính mà cịn là một khía cạnh quan trọng của sự phát triển cá nhân trong ngành cơng nghiệp này

Ngày đăng: 01/07/2024, 11:46

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

TÀI LIỆU LIÊN QUAN