Sắp xếp trộn¶
Tóm lược nội dung
Bài này trình bày thuật toán sắp xếp trộn nhằm minh họa phương pháp chia để trị.
Bài toán¶
Yêu cầu:
Sắp xếp một mảng số nguyên theo thứ tự tăng dần bằng thuật toán sắp xếp trộn.
Đầu vào:
Mảng A gồm n số nguyên.
Đầu ra:
Mảng A có thứ tự tăng dần.
Bộ kiểm thử:
| Đầu vào | Đầu ra |
|---|---|
| 1 7 4 0 9 4 8 | 0 1 4 4 7 8 9 |
Thuật toán¶
Chia mảng A thành hai mảng con: nửa trái và nửa phải.
Tiến trình này được thực hiện đệ quy cho đến khi các mảng con chỉ còn một phần tử duy nhất.
Vì mảng mà chỉ có một phần tử luôn được xem là đã có thứ tự nên ta bắt đầu thực hiện thao tác "trộn" các mảng con này lại với nhau theo thứ tự tăng dần để hình thành các mảng lớn hơn cũng có thứ tự.
Tiếp tục "trộn" các mảng con nửa trái và nửa phải đã có thứ tự như thế cho đến khi thu được mảng như ban đầu và có thứ tự.
Dựa theo ý tưởng trên, sắp xếp trộn được mô tả theo phương pháp chia để trị như sau:
Thuật toán sắp xếp trộn
Bước 1: Chia
Chia mảng bằng cách xác định vị trí ở giữa: mid = (left + right) // 2.
Bước 2: Trị
Bước này bao gồm hai trạng thái:
-
Trị trực tiếp đối với trường hợp cơ sở:
Khi mảng có kích thước bằng 1, thuật toán dừng chia và trả về chính mảng đó vì nó đã mặc nhiên có thứ tự.
-
Trị bằng đệ quy:
Gọi đệ quy hàm sắp xếp trộn cho nửa trái và nửa phải.
Kết quả của bước này là hai mảng con có thứ tự tăng dần.
Bước 3: Kết hợp
Thực hiện "trộn" hai mảng con đã có thứ tự thành một mảng mới duy nhất và cũng có thứ tự.
Hình sau minh họa thuật toán sắp xếp trộn đối với mảng A = [1, 7, 4, 0, 9, 4, 8].
Viết chương trình¶
1. Viết hàm merge_sort() dùng để thực hiện thuật toán sắp xếp trộn.
Hàm gồm có ba tham số đầu vào:
Alà mảng ban đầu cần sắp xếp.leftvàrightlà chỉ số dùng để xác định phạm vi của phần mảng cần xử lý trong mảngA.
2. Viết hàm merge_two_arrays() dùng để trộn mảng con trái và mảng con phải lại thành một.
Hàm gồm có bốn tham số:
Alà mảng ban đầu cần sắp xếp.left,midvàrightlà các chỉ số dùng để xác định ranh giới của hai mảng con trái và phải trong mảngA.
Hàm hoạt động như sau:
- Khởi tạo mảng con trái
Lvà mảng con phảiRtừ mảngA. -
Khởi tạo các biến dùng làm chỉ số cho từng mảng:
L_i: chỉ số của mảngLR_i: chỉ số của mảngRA_i: : chỉ số của mảngA
-
Trộn hai mảng con vô mảng
A:- So sánh từng cặp phần tử của
LvàRvới nhau. Nếu phần tử củaLnhỏ hơn thì nạp vô mảngA. Ngược lại, phần tử củaRnhỏ hơn, nạp phần tử củaRvô mảngA. - Tăng chỉ số của các mảng để di chuyển đến vị trí tiếp theo trong mảng.
- So sánh từng cặp phần tử của
-
Nạp các phần tử còn lại, nếu có, của mảng
Lvô mảng A. - Nạp các phần tử còn lại, nếu có, của mảng
Rvô mảng A.
3. Viết chương trình chính.
Trong chương trình chính, ta tạm thời bỏ qua việc cho người dùng nhập mảng. Thay vào đó, ta khởi tạo mảng cố định, rồi gọi hàm merge_sort() để sắp xếp mảng Array.
4. Chạy chương trình trên, kết quả như sau:
Mã nguồn¶
Code đầy đủ được đặt tại:
Some English words¶
| Vietnamese | Tiếng Anh |
|---|---|
| sắp xếp trộn | merge sort |
