Ý tưởng:
merge sort chia danh sách dữ liệu cần được sắp xếp thành hai nữa bằng nhau, và
đặt chúng vào các vùng chứa dữ liệu
riêng biệt (list, array,…). mỗi mảng dữ liệu được sắp xếp một cách đệ quy, sau đó trộn lẫn vào nhau tạo
thành danh sách dữ liệu được sắp xếp cuối
cùng. giống như hầu hết các phương pháp sắp xếp đệ quy, merge sort có độ phức tạp là o(n log n).
cách triển khai cơ bản của merge sort là dùng ba mảng dữ liệu
– mỗi mảng để chứa mổi nữa của tập dữ liệu
cần sắp xếp và một mảng chứa danh sách
được sắp xếp cuối cùng. thuật toán được giới thiệu sau đây trộn các mảng lại thành một, vì vậy chỉ sử dụng hai mảng
cho toàn bộ quá trình xử lý. hiện nay
cũng tồn tại phiên bản không đệ quy của merge sort, nhưng chúng không thu được bất kì một cải tiến tốc
độ nào so với phiên bản đệ quy qua thử
nghiệm trên hầu hết các kiến trúc xử lý.
merge sort thì nhanh hơn một ít so với heap sort với các tập
dữ liệu lớn, nhưng nó đòi hỏi 2 lần bộ
nhớ so với heap sort vì vậy nó không được
ưa chuộng trong việc triển khai ứng dụng dù cho mục đích là gì –
quick sort là lựa chọn tốt hơn cho thời
gian và heap sort thì lại là lựa chọn tốt
hơn với các tập dữ liệu rất lớn.
giống như quick sort, merge sort là phương pháp dựa trên đệ
quy, điều này khiến nó sẽ là lựa chọn tồi
với các ứng dụng chạy trên máy tính bị
giới hạn về bộ nhớ.
thuật giải:
- ta xem dãy cần sắp xếp có n phần tử là n đoạn và mỗi đoạn
đã được sắp xếp là dãy tăng dần rồi (tất nhiên vì chỉ mỗi đoạn chỉ có 1 phần tử).
- sau đó ta trộn 2 đoạn liên tiếp nhau để tạo thành các đoạn
có độ dài bằng 2 sao cho mỗi đoạn đã được sắp xếp tăng dần.
- và tiếp tục cứ trộn 2 đoạn liên tiếp, ta sẽ được những đoạn
có độ dài lớn hơn và đồng thời số đoạn trong dãy cũng sẽ ít đi... và cho tới
khi chỉ còn lại 1 đoạn duy nhất là dãy đã được sắp xếp tăng dần.
Cài đặt hàm :
void merge(int a[],int k1,int k2,int k3) { int i,j,z,t[100]; i=k1; j=k2; z=k1; // Tron phan tu // So sanh cac phan tu de dua vao day T while((i<k2)&&(j<=k3)) { if (a[i]<=a[j]) //*** { t[z]=a[i]; i++; } else { t[z]=a[j]; j++; } z++; } // Gan cac phan tu con lai cua day (k1->k2-1) vao day T (neu con) if(i>=k2) while (z<=k3) { t[z]=a[j]; j++; z++; } // Gan cac phan tu con lai cua day (k2->k3) vao day T (neu con) if (j>k3) while (z<=k3) { t[z]=a[i]; i++; z++; } // Sao chep day T vao day A for(z=k1;z<=k3;z++) a[z]=t[z]; }
0 comments:
Post a Comment