1 .GIỚI THIỆU
3. MỘT SỐ THUẬT TOÁN SẮP XẾP
3.7 SẮP XẾP TRỘN (MERGE SORT)
Cho dãy ban đầu a0, a2, …, an-1. Ta ln có thể coi nó là tập hợp liên tiếp của các dãy có thứ tự. Ta gọi các dãy có thứ tự này là các dãy con.
Trong phương pháp Merge Sort, vấn đề là ta tìm cách phân hoạch dãy ban đầu thành các dãy con. Sau khi phân hoạch xong, dãy ban đầu sẽ được tách thành hai dãy phụ theo nguyên tắc phân phối luân phiên dãy con. Sau đó, ta trộn từng cặp dãy con của hai dãy phụ thành một dãy con của dãy ban đầu. Ta nhận thấy số dãy con của dãy ban
41
đầu lúc này giảm đi ít nhất là một nửa. Cứ thế sau một số bước, ta sẽ nhận được dãy ban đầu với số dãy con bằng 1, có nghĩa là ta đã sắp xếp xong.
Có hai phương pháp trộn: Trộn tự nhiên và trộn trực tiếp:
Trộn tự nhiên: Phương pháp này hoạt động trên ý tưởng sử dụng dãy con tự nhiên có
sẵn của dãy ban đầu. Ví dụ với dãy 1 3 5 4 8 9 10 thì chúng ta chỉ có 3 dãy con tăng là 1 3 5 4 8 9 10. Sau đó sẽ tiến hành phân phối đều luân phiên các dãy con này vào 2 dãy phụ, sau khi phân hết dãy ban đầu chúng ta sẽ trộn lại được dãy mới có số lượng dãy con ít hơn. Cứ tiếp tục tách – trộn đến khi nào chỉ thu được một dãy con duy nhất.
Trộn trực tiếp: đây là phương pháp trộn đơn giản nhất. Việc phân hoạch dãy ban đầu
đơn giản như sau: Với dãy ban đầu có n phân tử, ta cứ phân hoạch thành n dãy con. Vì rằng mỗi dãy con chỉ có 1 phần tử nên nó là dãy có thứ tự. Cứ mỗi lần tách – trộn, chiều dài của dãy con sẽ được nhân đơi. Ví dụ với dãy 1 3 5 4 8 9 10 thì ban đầu giả sử có 7 dãy con, mỗi dãy 1 phần tử.
So sánh: Rõ ràng với phương pháp trộn tự nhiên thì số bước lặp tách – trộn sẽ ít hơn vì
nó tận dụng được tình trạng của dãy ban đầu. Nhưng ngược lại để cài đặt bằng phương pháp trộn tự nhiên thì rất phức tạp do chúng ta khó kiểm sốt được số lượng phần tử trong mỗi dãy con tại mỗi bước. Vì vậy trong tài liệu này chúng ta sẽ cùng tìm hiểu thuật toán trộn trực tiếp.
Thuật giải
Bước 1: Khởi động k = 1 //Với k là chiều dài dãy con
Bước 2: Phân phối dãy a = a0, a2, …, an-1 vào hai dãy phụ b, c theo nguyên
tắc phân phối luân phiên từng dãy con. b = a0, …, ak, a2k+1, …, a3k, …
c = ak+1, …, a2k, a3k+1, …, a4k
Bước 3: Từ 2 dãy phụ b, c, ta trộn từng cặp dãy con và đưa vào dãy a.
Bước 4: k = k * 2
Nếu k < n: quay lại bước 2.
Ngược lại: STOP!
42
Sắp xếp dãy số tăng dần:
38 27 43 3 9 82 10
43
Độ phức tạp
44
Trường hợp xấu nhất: O(nlogn). Trường hợp trung bình: O(nlogn).