Sắp xếp trộ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.
Input¶
Mảng A gồm n số nguyên.
Output¶
Mảng A có thứ tự tăng dần.
Bộ test¶
Input mẫu¶
Ouput mẫu¶
Thuật toán sắp xếp trộn¶
Ý tưởng chính của thuật toán là chia mảng A thành hai mảng con trái và phải. Sau đó, sắp xếp hai mảng con này. Cuối cùng, trộn hai mảng con lại thành mảng có thứ tự tăng dần.
Tiến trình chia thành hai mảng con được lặp lại nhiều lần cho đến khi mỗi mảng con chỉ còn một phần tử, đồng nghĩa không thể chia đôi được nữa.
Mảng có một phần tử được xem là mảng đã sắp xếp. Lúc này, ta có thể thực hiện trộn hai mảng lại với nhau.
Với thao tác trộn, ta duyệt đồng thời hai mảng con trái và phải. Lần lượt so sánh phần tử của hai mảng với nhau và đặt chúng vào đúng thứ tự của mảng kết quả.
Dựa theo ý tưởng trên, sắp xếp trộn được mô tả theo kỹ thuật chia để trị như sau:
Thao tác chia
Được thể hiện ở chỗ: chia mảng ban đầu thành hai mảng con: trái và phải.
Cụ thể, chia bằng cách xác định vị trí của phần tử ở giữa: mid = (left + right) // 2
.
Thao tác trị
Được thể hiện ở hai chỗ:
- Trị đối với trường hợp cơ sở:
- Mảng chỉ còn một phần tử, không thể chia đôi được nữa.
- Trị đối với trường hợp tổng quát:
- Gọi đệ quy cho mảng con bên trái.
- Gọi đệ quy cho mảng con bên phải.
Lệnh gọi đệ quy vừa đóng vai trò "chia" vừa đóng vai trò "trị".
Thao tác kết hợp
Được thể hiện ở chỗ: trộn hai mảng con đã có thứ tự.
Khi trộn mảng con bên trái đã có thự tự và mảng con bên phải đã có thứ tự, kết quả nhận được cũng sẽ là một mảng có thứ tự.
Cách giải đề xuất¶
Hàm trộn hai mảng con¶
Hàm merge_two_arrays()
dùng để trộn hai mảng con đã có thứ tự lại với nhau.
Hàm này gồm bốn tham số:
A
: mảng ban đầuleft
,mid
,right
: là các vị trí dùng để xác định mảng con trái và phải.
Cách thức trộn như sau:
Bước 0:
- Tạo hai mảng con
L
vàR
từ mảngA
. - Khởi tạo ba biến
left_idx
,right_idx
,A_idx
lần lượt là chỉ số của mảng conL
,R
vàA
.
Bước 1:
So sánh từng phần tử của L và R với nhau, nếu phần tử của L nhỏ hơn thì đặt vào mảng A, ngược lại đặt phần tử của R vào mảng A.
Sau đó di chuyển các chỉ số của các mảng đến vị trí tiếp theo để chuẩn bị cho lần so sánh tiếp theo.
Bước 2:
- Nếu mảng
L
vẫn còn phần tử thì đặt các phần tử còn lại vào mảngA
. - Nếu mảng
R
vẫn còn phần tử thì đặt các phần tử còn lại vào mảngA
.
Hàm sắp xếp trộn¶
Hàm merge_sort()
dùng để sắp xếp mảng A
theo thứ tự tăng dần.
In kết quả¶
Trong chương trình chính, ta gọi hàm merge_sort()
ra thực hiện.
Output:
Mã nguồn¶
Code đầy đủ được đặt tại:
Some English words¶
Vietnamese | Tiếng Anh |
---|---|
sắp xếp trộn | merge sort |