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 1HOC 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 2HOC 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 3MUC 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 4LOI 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 5I 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 6II Ý 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 72 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 8while (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 10Ta 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 11Tiế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 12Ta 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 13Luc 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 14Do 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 150 1 2 3 4 5 6 7
15
Trang 160 1 2 3 4 5 6 7
16
Trang 17Như 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 18Chọ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 19b 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