Để tìm kiếm trở nên hiệu quả, nhanh chóng thì dữ liệu phải được sắp xếptheo một trật tự, đòi hỏi chúng ta phải xây dựng những thuật toán sắp xếp phùhợp.Sắp xếp dữ liệu là một phần tất yế
Trang 1HỌC VIỆN NGÂN HÀNG KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ
BÁO CÁO BÀI TẬP LỚNHọc phần: Cấu trúc dữ liệu và giải thuật
Trang 2HỌC VIỆN NGÂN HÀNG KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ
BÁO CÁO BÀI TẬP LỚNHọc phần: Cấu trúc dữ liệu và giải thuật
Trang 3LỜI CẢM ƠN
Để hoàn thành tốt bài tập lớn này, em xin gửi lời cảm ơn chân thành nhấtđến Giảng viên hướng dẫn Ths Cô là người đã tận tâm chỉ bảo, hướng dẫnchúng em về mặt nội dung và kiến thức từ những buổi đầu trên lớp cũng nhưtrong quá trình chúng em làm bài báo cáo này, cô đã luôn tận tình giải đáp mọithắc mắc và hướng dẫn chúng em một cách chi tiết và cụ thể nhất Vì vậy, đểhoàn thành được bài báo cáo này không thể không nhắc đến sự chỉ bảo của cô.Mặc dù có nhiều cố gắng để thực hiện bài báo cáo một cách hoàn chỉnhnhất, song bài báo cáo không tránh khỏi những thiếu sót Em rất mong nhậnđược sự góp ý quý báu của quý cô để bài báo cáo của chúng em được hoàn thiệnhơn và mang nhiều ý nghĩa thực tiễn
Em xin chân thành cảm ơn!
Hà Nội, ngày 22 tháng 03 năm 2023
Nhóm 09
Trang 4LỜI CAM ĐOAN
Nhóm 09 chúng em xin cam đoan đề tài: “Thuật toán sắp xếp trộn – MergeSort” là một công trình nghiên cứu độc lập dưới sự hướng dẫn của giảng viênKhoa Hệ thống thông tin quản lý – Học viện Ngân hàng là Ths Ngoài ra không
có bất cứ sự sao chép, đảm bảo tính liêm chính trong học thuật Đề tài, nội dungbáo là sản phẩm mà mỗi thành viên nhóm chúng em đã nỗ lực nghiên cứu trongquá trình học tập tại trường cũng như áp dụng vào thực tế Các số liệu, kết quảtrình bày trong báo cáo là hoàn toàn trung thực, đã có trích dẫn từ những nguồntham khảo Nhóm chúng em xin chịu hoàn toàn trách nhiệm, kỷ luật nếu như cóvấn đề xảy ra
Chúng em xin cam đoan!
Hà Nội, ngày 22 tháng 03 năm 2023
Nhóm 09
Trang 5MỤC LỤC
PHẦN 1: LỜI MỞ ĐẦU 1
PHẦN 2: NỘI DUNG 2
1 Giới thiệu thuật toán Merge Sort 2
2 Ý tưởng và các bước tiến hành 2
2.1 Ý tưởng 2
2.2 Các bước tiến hành 3
3 Cài đặt thuật toán 3
4 Ví dụ minh họa 7
5 Độ phức tạp 13
6 Ưu điểm và nhược điểm 14
6.1 Ưu điểm 14
6.2 Nhược điểm 14
7 Ứng dụng của thuật toán 15
PHẦN 3: KẾT LUẬN 17
TÀI LIỆU THAM KHẢO 18
Trang 6PHẦN 1: LỜI MỞ ĐẦU
Trong kỷ nguyên số hiện nay, công nghệ thông tin (CNTT) đã và đang trởthành mục tiêu mũi nhọn, định hướng phát triển của mỗi quốc gia Tại ViệtNam, việc đẩy mạnh sự phát triển của CNTT đang là một trong những mục tiêuhàng đầu Mặc dù CNTT đang ngày một phát triển, tốc độ xử lý thông tin, dữliệu cũng đã tăng lên nhưng chúng ta vẫn sẽ gặp nhiều khó khăn trong một sốbài toán khó, có dữ liệu đầu vào lớn Vấn đề này gây nhiều khó khăn đến việcphải giải quyết bài toán trong thời gian ngắn được quy định
Ngày nay, với nền công nghệ phát triển như vũ bão thì nhu cầu về việckhai thác, tìm kiếm thông tin của con người càng tăng cao Việc nâng cao tínhhiệu quả qua các giải thuật sắp xếp cũng ngày càng quan trọng và được chú ýđến Để tìm kiếm trở nên hiệu quả, nhanh chóng thì dữ liệu phải được sắp xếptheo một trật tự, đòi hỏi chúng ta phải xây dựng những thuật toán sắp xếp phùhợp
Sắp xếp dữ liệu là một phần tất yếu trong việc phân tích dữ liệu ví dụ nhưtrên Facebook ta cần sắp xếp và tính toán các nội dung hiện lên new feed, tin tứcnào liên quan đến ta nhất thường sẽ xuất hiện ở đầu bảng; việc tìm kiếm trênGoogle cũng vậy, ta không hề mong muốn Google gợi ý cho ta những thông tinkhông phù hợp, kết quả nào gần với từ khóa cần tìm nhất phải xuất hiện đầutiên Việc sắp xếp dữ liệu giúp chúng ta nhanh chóng tìm kiếm được dữ liệumong muốn, hiểu rõ hơn về dữ liệu của mình hoặc so sánh được các dữ liệu.Chính vì vậy, việc sắp xếp dữ liệu giúp ta tìm kiếm nhanh hơn và hỗ trợnhững bài toán rắc rối khác Bài toán sắp xếp chính là một nền tảng quan trọngtrong khoa học máy tính Từ những nhu cầu trên mà các thuật toán sắp xếp đãđược ra đời Một trong những thuật toán đó chính là Merge Sort ( thuật toán sắpxếp trộn) , đây là một thuật toán khá phức tạp nhưng nó đem lại hiệu suất cao vàtốc độ xử lý nhanh
Trang 7PHẦN 2: NỘI DUNG
1 Giới thiệu thuật toán Merge Sort
Sắp xếp trộn – Merge Sort là một thuật toán sắp xếp thuộc loại sắpxếp nhanh trong khoa học máy tính Merge sort là thuật toán điển hìnhcho tư tưởng chia để trị để giải quyết các bài toán có dữ liệu lớn và phứctạp Cụ thể với bài toán sắp xếp, nó sẽ chia nhỏ danh sách cần sắp xếpthành từng phần tử rời, sau đó hòa nhập theo phương pháp trộn tự nhiênthành dãy có thứ tự
Merge sort là một trong những phương pháp đầu tiên sử dụng trongbài toán sắp xếp Thuật toán này được đề xuất bởi John Von Neumannvào đầu năm 1945 Một cuộc thảo luận và phân tích chi tiết về sắp xếphợp nhất đã được xuất hiện trong một báo cáo của Goldstine và Neumannnhư đầu năm 1948
2 Ý tưởng và các bước tiến hành
2.1 Ý tưởng
Các thuật toán sắp xếp đơn giản như Bubble Sort, Insertion Sort đềukhông thể xử lý được dữ liệu lớn Thuật toán sắp xếp trộn lấy ý tưởng từ việcchia để trị để chia nhỏ bài toán thành các bài toán nhỏ hơn, sau đó giải quyếtchúng Từ đó sẽ giúp xử lý dữ liệu lớn một cách tốt hơn, tối ưu về mặt thờigian Ý tưởng đưa ra như sau:
Chia danh sách gồm n phần tử chưa được sắp xếp thành n danh sách con,mỗi danh sách chứa một phần tử (danh sách một phần tử được coi là đãsắp xếp)
Liên tục hợp nhất các danh sách con để tạo ra các danh sách con được sắpxếp mớ cho đến khi chỉ còn lại một danh sách Đây sẽ là danh sách đượcsắp xếp
Trang 82.2 Các bước tiến hành
Bước 1:
Chia dãy cần sắp xếp thành 2 dãy con
Từ dãy con thu được lại tiếp tục chia thành 2 dãy con nhỏ hơn nữaQuá trình phân chia tiếp tục cho đến khi thu được dãy con chỉ còn duynhất 1 phần tử
Bước 2:
Hòa nhập 2 dãy con nhỏ nhất thành dãy con lớn hơn sao cho đúng thứ tự
Từ hai dãy con lớn hơn lại hòa nhập thành 2 dãy con lớn hơn nữa….Quá trình hòa nhập cứ tiếp tục như vậy cho đến khi thu được dãy số banđầu đã được sắp xếp
3 Cài đặt thuật toán
Trang 9l - left index : chỉ số nhỏ nhất của phần tử trong mảng
m - middle index: chỉ số mid
r - right index :chỉ số lớn nhất của phần tử trong mảng
*/
Tìm phần tử m ( middle-index ) để chia mảng thành 2 nửa ( nếu left<right)
void mergeSort(int a[], int l, int r)
1.2 Trộn hai mảng con a[l m] và a[m+1 r]
Hàm con Merge ( gồm 4 tham số ) dùng để trộn và sắp xếp mảng a lại từ vịtrí left qua vị trí mid đến vị trí right, đây được coi là phần quan trọng nhấtcủa thuật toán
void merge(int a[], int l, int m, int r)
Trang 10int i, j, k;
int n1 = m - l + 1; //n1: độ dài của nửa thứ nhất
int n2 = r - m; //n2: độ dài của nửa còn lại
Sau khi khai báo các biến, ta copy dữ liệu qua các mảng tạm, trước tiên thì cần tạo các mảng tạm để lưu trữ các phần tử:
Trang 11/* Copy các phần tử còn lại của mảng L vào a (nếu có) */
Trang 127 {
Giải thuật sắp xếp trộn chia toàn bộ mảng thành hai nửa Tiến trình chianày tiếp tục diễn ra cho đến khi không còn chia được nữa và chúng ta thuđược các giá trị tương ứng biểu diễn các phần tử trong mảng
Ở đây, chúng ta thấy rằng một mảng gồm 7 mục được chia thành haimảng có kích thước tương ứng là 4 và 3
Bây giờ, một lần nữa thấy rằng chỉ số bên trái nhỏ hơn chỉ số bên phảicho cả hai mảng, nếu tìm thấy có, sau đó tính lại điểm giữa cho cả haimảng
Trang 138Tiến trình chia này không làm thay đổi thứ tự các phần tử trong mảngban đầu Bây giờ chúng ta tiếp tục chia các mảng này thành 2 nửa.
Chia tiếp hai mảng này thành các nửa tiếp theo, cho đến khi đạt được cácđơn vị nguyên tử của mảng và không thể chia tiếp nữa
Sau khi chia mảng thành các đơn vị nhỏ nhất, bắt đầu gộp lại các phần tửdựa trên so sánh kích thước của các phần tử
Bây giờ chúng ta tổ hợp chúng theo như đúng cách thức mà chúng đượcchia ra
Đầu tiên chúng ta so sánh hai phần tử trong mỗi list và sau đó tổ hợpchúng vào trong một list khác theo cách thức đã được sắp xếp Ví dụ,chúng ta so sánh 32 và 25 và trong list khác chúng ta đặt 25 ở đầu và sau
đó là 32 Tiếp đó, chúng ta so sánh 47 và 3 và trong list khác chúng tađặt 3 ở đầu và sau đó là 47 Tương tự, chúng ta thay đổi vị trí của 7, 16
và 85 được đặt tương ứng
Vòng lặp tiếp theo là để kết hợp từng cặp list một ở trên Chúng ta sosánh các giá trị và sau đó hợp nhất chúng lại vào trong một list chứa giátrị, và các giá trị này đều đã được sắp thứ tự
Sau khi hợp nhất bước cuối cùng, ta sẽ nhận được một danh sách đã sắpxếp như sau:
Trang 15Phần chương trình:
#include<stdio.h>
#include<conio.h>
// Gop hai mang con a[l m] và a[m+1 r]
void merge(int a[], int l, int m, int r)
// Gop hai mang tam tren vào mang a
i = 0; // Khoi tao chi so bat dau cua mang con dau tien
j = 0; // Khoi tao chi so bat dau cua mang con thu hai
k = l; // Khoi tao chi so bat dau cua mang luu ket qua while (i < n1 && j < n2)
{
if (L[i] <= R[j])
Trang 1611 {
Trang 1712 k++;
// Ham xuat mang
void xuat(int a[], int size)
Trang 18Độ phức tạp thời gian của Sắp xếp hợp nhất(Merge Sort) là θ(nLogn) trong cả 3 trường hợp (xấu nhất, trung bình và tốt nhất) => vì sắp
Trang 19Độ phức tạp trung bình O(n log n), tốc độ giải quyết khá nhanh
Có tính ổn định và thích ứng, tốc độ không bị ảnh hưởng nhiều bởi dữliệu đầu vào
Xử lý khá tốt với dữ liệu lớn đặc biệt là dạng list, file
6.2 Nhược điểm
Tốn nhiều bộ nhớ nếu sử dụng đệ quy
Code khó cài đặt, tương đối phức tạp
Trong hầu hết các trường hợp, thuật toán này không được đánh giá caohơn Quick sort
7 Ứng dụng của thuật toán
Trang 2015Merge sort đây là một thuật toán sắp xếp đơn giản và hiệu quả, được
sử dụng rộng rãi trong nhiều ứng dụng thực tế Một vài ứng dụng có thể kểđến như:
Bài toán nghịch đảo (inversion problem) là một bài toán quan trọngtrong khoa học máy tính và toán học, trong đó cần tìm số lần đổi chỗ haiphần tử để biến một dãy đã cho thành dãy đã sắp xếp Cụ thể, Merge sort
sử dụng kỹ thuật chia để trị (divide and conquer) để sắp xếp một dãy số.Trong quá trình sắp xếp, Merge sort tính toán số lần đổi chỗ (inversioncount) bằng cách đếm số cặp phần tử trong hai nửa của dãy số mà phần tửđứng sau có giá trị nhỏ hơn phần tử đứng trước trong nửa kia của dãy số.Sau đó, sử dụng phép trộn (merge) để trộn các nửa dãy đã sắp xếp lại vớinhau và tính toán số lần đổi chỗ của dãy số đã sắp xếp Ngoài ra, MergeSort cũng có thể được sử dụng để tối ưu hóa các thuật toán khác liên quanđến bài toán nghịch đảo, chẳng hạn như thuật toán tìm kiếm nhị phân(binary search) trong dãy số đã sắp xếp
Merge Sort là một trong những thuật toán sắp xếp nhanh được sửdụng rộng rãi với thời gian thực hiện là O(NlogN) trong mọi trường hợp.Việc sắp xếp một dãy số gồm 106 số tốn chưa tới 1 giây Không chỉ manglại tốc độ cực kỳ tốt, Merge Sort còn giữ được thứ tự của các phần tử bằngnhau sau khi sắp xếp Vì vậy Merge Sort được ứng dụng trong việc sắp xếpmột số lượng lớn dữ liệu mà không thể lưu trữ hết trong bộ nhớ
Với các file có kích thước lớn, việc sử dụng các thuật toán sắp xếpđơn giản như insertion sort hay selection sort sẽ gặp phải khó khăn về bộnhớ và thời gian, vì vậy Merge sort là một lựa chọn tốt hơn Cách thức hoạtđộng của Merge sort cho phép nó sắp xếp các file lớn bằng cách chia filethành các phần nhỏ hơn, sắp xếp từng phần rồi trộn các phần lại với nhau.Việc chia file thành các phần nhỏ hơn giúp giảm tải bộ nhớ cần sử dụng vàthuận tiện cho việc xử lý Sau đó, các phần được trộn lại với nhau để tạo ramột file lớn đã sắp xếp Ngoài ra, Merge sort còn được sử dụng để sắp xếp
Trang 2116các danh sách liên kết (linked list) lớn Vì danh sách liên kết không yêu cầuliên tục trong bộ nhớ, nó có thể được chia thành các phần nhỏ và sắp xếpcác phần đó một cách riêng biệt trước khi trộn lại với nhau.
Ngoài ra, Merge sort có thể được sử dụng để sắp xếp các khung âmthanh (audio frames) trong các tệp âm thanh.Cụ thể, khi trộn các file âmthanh, các tệp âm thanh thường được chia thành các khung âm thanh có độdài nhất định (ví dụ: 10ms) Để trộn các tệp âm thanh, các khung âm thanhtrong các tệp này cần được sắp xếp theo thứ tự thời gian Merge sort có thểđược sử dụng để sắp xếp các khung âm thanh theo thời gian, trước khi trộnchúng lại với nhau để tạo ra một tệp âm thanh mới Không những thế,Merge sort cũng có thể được sử dụng để trộn các tệp âm thanh có độ dàikhác nhau
Merge sort có thể được áp dụng trong thương mại điện tử Khi kháchhàng tìm kiếm các sản phẩm trên một trang web thương mại điện tử, họthường muốn sắp xếp các sản phẩm theo giá cả để tìm kiếm sản phẩm phùhợp với ngân sách của mình Merge sort có thể được sử dụng để sắp xếpcác sản phẩm theo giá cả từ thấp đến cao hoặc ngược lại Không những vậyMerge sort cũng có thể được sử dụng để sắp xếp các sản phẩm theo tên,giúp khách hàng dễ dàng tìm kiếm sản phẩm cần thiết Đặc biệt, Merge sortcũng có thể được sử dụng để sắp xếp các sản phẩm theo độ phổ biến, giúpngười quản lý trang web thương mại điện tử hiểu được xu hướng mua hàngcủa khách hàng và điều chỉnh chiến lược kinh doanh của mình
Tóm lại, Merge sort là một trong những thuật toán sắp xếp hiệu quả
và linh hoạt trong thực tiễn Tuy nhiên, để đánh giá đầy đủ về ứng dụng củaMerge sort, cần phải xem xét các yếu tố khác như tính ổn định, chi phí bộnhớ và kích thước dữ liệu
Trang 22PHẦN 3: KẾT LUẬN
Việc sắp xếp là thao tác giúp cho cuộc sống của chúng ta trở nên dễdàng hơn Thử tưởng tượng một quyển từ điển không được sắp xếp theothứ tự alphabet và chúng ta phải lật từng trang một để tìm thứ mình cần.Điều đó rất bất tiện Cũng như trong lập trình, thuật toán sắp xếp giúpthao tác tìm kiếm, lọc hay giải quyết vấn đề của chúng ta dễ dàng hơn rấtnhiều Với những ưu điểm mà thuật toán Merge Sort mang lại, nó có lẽ làmột lựa chọn sắp xếp tốt và được sử dụng phổ biến trong khoa học máytính
Trang 23Tài liệu trực tuyến
1 GeekforGeek (23/03/2023), “C Program for Merge Sort”,
https://www.geeksforgeeks.org/c-program-for-merge-sort/?
fbclid=IwAR0nBQUXosT4aTaW3PVMGPctbsJ6yfH5_BZhQH8OeOGwKENjJg9n2RLEeWs
2 DuongDinh (06/05/2021), “Thuật toán sắp xếp trộn”,
https://duongdinh24.com/thuat-toan-sap-xep-tron/
3 Hoclaptrinh.vn, “Giải thuật sắp xếp trộn (Merge Sort)’,
thuat-sap-xep-tron-merge-sort?
https://hoclaptrinh.vn/tutorial/cau-truc-du-lieu-amp-giai-thuat-55-bai/giai-fbclid=IwAR1xmLPMutUQxd2YXz62FqJLaSLuN7QMey11IEdADfuXY0de3O4KfzUPg3o
4 Khuê Nguyễn (13/03/2022), “Các thuật toán sắp xếp trong C”,
https://khuenguyencreator.com/cac-thuat-toan-sap-xep-trong-c/#Sap_xep_tron_Merge_Sort