báo cáo bài tập lớn cấu trúc dữ liệu và giải thuật đề tài thuật toán sắp xếp trộn merge sort

23 1 0
Tài liệu đã được kiểm tra trùng lặp
báo cáo bài tập lớn cấu trúc dữ liệu và giải thuật đề tài thuật toán sắp xếp trộn merge sort

Đ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

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

HỌC VIỆN NGÂN HÀNGKHOA 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

ĐỀ TÀI:

THUẬT TOÁN SẮP XẾP TRỘNMERGE SORT

Giảng viên hướng dẫn : Ths.

Hà Nội, ngày 22 tháng 03 năm 2023

Trang 2

HỌ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

ĐỀ TÀI:

THUẬT TOÁN SẮP XẾP TRỘNMERGE SORT

Giảng viên hướng dẫn: Ths.Giang Thị Thu HuyềnThành viên nhóm 09

Hà Nội, ngày 22 tháng 03 năm 2023

Trang 3

LỜ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 4

LỜ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ôngcó 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 5

MỤ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

Trang 6

PHẦ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 7

PHẦN 2: NỘI DUNG1 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ành2.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 8

2.2 Các bước tiến hànhBướ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

Dữ liệu hỗ trợ: 2 mảng tạm để lưu trữ các phần tửInt L[n1], R[n2];

Trang 9

l - left index : chỉ số nhỏ nhất của phần tử trong mảngm - 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) {

if (l < 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 10

Sau khi copy ta sẽ trộn hai mảng tạm trên vào mảng a[] bắt đầu từ chỉ sốleft, gán chỉ số i=j=0 đồng thời gán biến k=l, biến k - biến giám sát để trộncác phần tử của hai mảnh đã được sắp xếp lại

i = 0; j = 0; k = l;

Lặp với điều kiện i<n1 và j<n2 ( nghĩa là để chỉ số của i và j không vượtquá mảng ), bắt đầu từ chỉ số left sau đó mới tăng chỉ số i (j) lên khi đó thìta trộn hai nửa mảng lại với nhau thì nó sẽ điền đầy các phần tử từ chỉ sốleft tới chỉ số right.

while (i < n1 && j < n2) {

Trang 11

6 if (L[i] <= R[j])

{

a[k] = L[i]; i++; } else {

a[k] = R[j]; j++; } k++; }

Trong trường hợp vòng lặp while đã kết thúc nhưng i<n1 hoặc j<n2 tức làmảng chưa trộn xong thì ta copy các phần tử còn lại của mảng left hoặcright vảo mảng a.

/* Copy các phần tử còn lại của mảng L vào a (nếu có) */ while (i < n1)

{

a[k] = L[i]; i++; k++; }

/* Copy các phần tử còn lại của mảng R vào a (nếu có) */ while (j < n2)

Trang 12

7 {

a[k] = R[j]; j++; k++; }}

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 13

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 15

Phần chương trình:

// Gop hai mang con a[l m] và a[m+1 r]void merge(int a[], int l, int m, int r){

int i, j, k;

int n1 = m - l + 1; // n1: do dai cua nua thu nhat int n2 = r - m; // n2: do dai cua nua con lai // Tao cac mang tam de luu tru cac phan tu int L[n1], R[n2];

// Copy du lieu sang các mang tam for (i = 0; i < n1; i++)

L[i] = a[l + i]; for (j = 0; j < n2; j++) R[j] = a[m + 1+ j];

// 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 16

11 {

a[k] = L[i]; i++; } else {

a[k] = R[j]; j++; } k++; }

// Copy cac phan tu con lai cua mang L vào a (neu co) while (i < n1)

{

a[k] = L[i]; i++; k++; }

// Copy cac phan tu con lai cua mang R vào a (neu co) while (j < n2)

{

a[k] = R[j]; j++;

Trang 17

12 k++;

}}

// l la chi so trai và r là chi so phai cua mang can duoc sap xep void mergeSort(int a[], int l, int r)

{ if (l < r) {

// Tuong tu (l+r)/2, nhung cách này tránh tràn so khi l và r lon int m = l+(r-l)/2;

// Goi ham de quy tiep tuc chia doi tung nua mang mergeSort(a, l, m); // de quy

int i;

for (i=0; i < size; i++) printf("%d ", a[i]); printf("\n");

Trang 18

// Ham Mainint main(){int l = 0;int r = 6

int a[] = {32, 25, 47, 3, 7, 85, 16}; printf("Mang khi chua sap xep la: \n"); xuat(a, 7);

mergeSort(a, l, r);

printf("\nMang khi da sap xep la: \n"); xuat(a, 7);

return 0; getch();}

Độ 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

Bộ nhớ sử dụng

Tốt nhất O (n log n) nTrung bình O (n log n) nXấu nhất O (n log n) n

=>.Độ phức tạp của bộ nhớ phụ của thuật toán merge sort là O(n) vì n bộ nhớphụ được yêu cầu trong việc thực hiện merge sort

6 Ưu điểm và nhược điểm6.1 Ưu điểm

Độ phức tạp trung bình O(n log n), tốc độ giải quyết khá nhanhCó 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

Trang 20

Merge sort đây là một thuật toán sắp xếp đơn giản và hiệu quả, đượcsử 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 sortsử 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 21

cá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 22

PHẦ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 23

Tài liệu trực tuyến

1 GeekforGeek (23/03/2023), “C Program for Merge Sort”,

fbclid=IwAR0nBQUXosT4aTaW3PVMGPctbsJ6yfH5_BZhQH8OeOGwKENjJg9n2RLEeWs

2 DuongDinh (06/05/2021), “Thuật toán sắp xếp trộn”,

3 Hoclaptrinh.vn, “Giải thuật sắp xếp trộn (Merge Sort)’,

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.

Ngày đăng: 19/06/2024, 17:03