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

Thông tin cơ bản

Tiêu đề Trình bày về thuật tốn sắp xếp nhanh - QuickSort
Tác giả Trần Thị Huyền Châm, Hồng Đức Duy, Ngơ Thị Thu Hà, Nguyễn Thu Huyền, Vi Thị Phương Thùy
Người hướng dẫn Thầy Nguyễn Thanh Thụy
Trường học Học Viện Ngân Hàng
Chuyên ngành Cấu Trúc Dữ Liệu Và Giải Thuật
Thể loại Bài Tập Lớn
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 20
Dung lượng 1,52 MB

Nội dung

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 toá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

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 toá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

1

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

2 Hoàng Đức Duy 25A4041530 20%

3 Ngô Thị Thu Hà 25A4041538 20%

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

Ha Noi, Thang 11 nam 2023

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Ð

Hình 2: Ý tưởng thuật tốn QuickSọt 2222-2222 ,Ổ

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 toá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 toá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 toán sắp xếp phố biến và mạnh mẽ nhất — thuật toá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 toán Sắp xếp nhanh, ý

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

xây dựng thuật toá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 toán

Như vậy, qua quá trình tìm hiểu về thuật toá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 toán thành công cụ hữu ích của mình trong

công việc

Trang 5

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

QuickSort là một thuật toá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 toá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 toá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

xuất bản vao nam 1962.

Trang 6

II Ý tưởng thuật toán

1 Ý tưởng

Thuật toán QuickSort là một thuật toá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 toá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 hoà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 toá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

"ftreHy Ls| 5 [ss] + |@] 12 | 4 [2 | 8 | SG ÔNG OS,

Pivot = 8

l3|@|+j+

Hình 2: Ý tưởng thuật toán QuickSort

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 toán:

Trong thuật toá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 toán

Dưới đây là thuật toá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)

{

i++;

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 toán

Cho day s6a: 12 2 8 5 16 4 15

Sắp xếp dãy a theo thứ tự tăng dần bằng thuật toán QuickSort như sau:

Trang 9

® @ @ @ ®@ @ @@

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

10

Trang 11

Tiếp tục duyệt ¡ và j Ta thấy ¡ dừng lai tai vi tri 2 do afi] = 8 > pivot vaj dừng lại tại vị trí

4 do a[j]= l < pivot Hoán đổi cặp phan tử a[ï] và a[j] tang i và giảm j

©@ ®@@œ-G@œ@

11

Trang 12

Ta thay i, j tiép tục duyệt cho đến khi gặp nhau tại vị trí 3 và dừng lai do ali] = 3 không

nhỏ hơn pivot và a[j] = 3 không lớn hơn pivot Hoán đổi cap phan tử a[ï] và a[j] tăng i va

giảm J

5 6 7

@®@ @ &® @Œ>Œ>Œ%®

@® Œ@ @ Œ@ @ @ Œ@

12

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:

®@ @@ @ @ ®@œ

13

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

Phan hoach day bén phai, chon 6 lam pivot va tiễn hành tuần tự như trên cho đến khi tất

cả phần tử đã được sắp xếp thì kết thúc chương trình:

OOOO 6668

14

Trang 15

0 1 2 3 4 5 6 7

15

Trang 16

0 1 2 3 4 5 6 7

16

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 toá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 toá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 toá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 toá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 toá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 toá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 toá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 toán

Độ phức tạp thời gian

tật toán sắp Xếp Trường hợp tôt Trường hợp trung Trường hợp xâu

17

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 toán Sắp xếp nhanh

a Uu diém

Quick Sort là một trong những thuật toá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 toá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 toá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 toán Quick Sort dễ dàng hơn so với

một sô thuật toá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 toá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 toá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 toán

18

Trang 19

b Nhuoc diém

Thuật toá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 toá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ỉ hoá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 toán Quicksort - một trong những thuật toá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 toá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 toán Quicksort, chúng ta đã hiểu rõ hơn về

cách thiết kế thuật toá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 toá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

19

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