Một ví dụ lâu đời khác là thuật toán sắp xếp trộn, phát hiện bởi John Von Neumann năm 1945 [3]. Ý tưởngthực tế là thông thường dãy dữ liệu đang được lưu trữ là dãy đã sắp xếp, các dữ liệu mới bổ sung thêm vào cuối dãy đã có. Xuất hiện nhu cầu cần sắp xếp lại để dãy dữ liệu sau khi nhập bổ sung thêm các phần tử mới phải được sắp xếp lại.
a) Ý tƣởng: ần sắp xế ộn” hai dãy đã được sắp thành
một dãy được sắ ủa thuật toán MergeSort.
b)Mô tả thuật toán
Trộn (Merge): Cho hai dãy đã sắp xếp B={b1,b2,…bm} và C={ c1,c2,…,cn} cần trộn thành dãy D={d1,d2,…,dm+n ợc sắp.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
i) Lần lượt xác định di ( 1<=i<=n+m) bằng cách chọn phần tử nhỏ hơn trong hai phần tử bj và ck (1<=j<=m; 1<=k<=n) tại mỗi bước.
ii) Trong cài đặt thường thêm một phần tử có giá trị lớn hơn giá trị các phần tử trong dãy vào cuối mỗi dãy B và C ( chẳng hạn, bm+1= Maxint và cn+1= Maxint, thường gọi là khóa cầm canh) để khi tất cả các phần tử của một dãy đã được lựa chọn cho dãy D thì các phần tử còn lại của dãy kia sẽ chuyển thành các phần tử còn lại của dãy D.
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
// Thủ tục trộn gọi đệ quy
voidMERGESORT(int X[], int L, int R)
{ int M; if (L<R){ M=int((L+R)/2); MERGESORT (X,L,M); MERGESORT (X,M+1,R); Merge(X,L,M+1,R); } }
// Thủ tục trộn hai đoạn đã sắp xếp trong một dãy
voidMERGE(int a[], int k1, int k2, int k3) {
inti,j,k,t; inttemp[]; i=k1; j=k2; k=k3; while (i<k2) and (j<=k3)
{ if (a[i]<=a[j]){ temmp[k]=a[i]; i=i+1; } else{ temp[k]=a[j]; j=j+1; } k=k+1; } if (i>=k2) for(t=j;t<=k3,t++) temp[k+t-j]=a[t]; else for(t=i;t<=k2,t++) temp[k+t-i]=a[t]; for(k=k1;t<=k3,k++)a[k]=temp[k]; } c) Ví dụ
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Hình 2.3 Ví dụ thuật toán sắp xếp trộn
d)Phân tích và đánh giá
Sắp xếp trộn là một thuật toán sắp xếp cổ điển nhất nhưng cho tới nay đó là thuật toán được coi là thuật toán sắp xếp ngoài mẫu mực.Phép toán tích cực trong phép trộn là phép đưa một phần tử khóa vào dãy kết quả nên độ phức tạp của trộn là O(N).
Trong sắp xếp trộn sử dụng không quá [logn] lần trộn nên độ phức tạp của thuật toán sắp xếp trộn là O(NlgN).Nhược điểm là phải dùng thêm không gian để lưu trữ dãy khóa d
(trong việc trộn).