Merge Sort là một thuật toán sắp xếp theo kiểu chia để trị (divide and conquer). Ý tưởng chính là chia mảng thành hai nửa, sắp xếp từng nửa bằng đệ quy, và sau đó kết hợp (merge) hai nửa đã sắp xếp lại thành một mảng đã sắp xếp.
Dưới đây là cách triển khai Merge Sort trong JavaScript:
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
// Tìm điểm giữa của mảng
const mid = Math.floor(arr.length / 2);
// Chia mảng thành hai nửa
const left = arr.slice(0, mid);
const right = arr.slice(mid);
// Đệ quy sắp xếp hai nửa
const sortedLeft = mergeSort(left);
const sortedRight = mergeSort(right);
// Kết hợp hai nửa đã sắp xếp
return merge(sortedLeft, sortedRight);
}
function merge(left, right) {
let result = [];
let leftIndex = 0;
let rightIndex = 0;
// So sánh từng phần tử của hai mảng và thêm phần tử nhỏ hơn vào kết quả
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
result.push(left[leftIndex]);
leftIndex++;
} else {
result.push(right[rightIndex]);
rightIndex++;
}
}
// Kết hợp các phần tử còn lại của mảng trái (nếu có)
while (leftIndex < left.length) {
result.push(left[leftIndex]);
leftIndex++;
}
// Kết hợp các phần tử còn lại của mảng phải (nếu có)
while (rightIndex < right.length) {
result.push(right[rightIndex]);
rightIndex++;
}
return result;
}
// Ví dụ sử dụng:
let array = [38, 27, 43, 3, 9, 82, 10];
console.log("Mảng ban đầu: " + array);
let sortedArray = mergeSort(array);
console.log("Mảng sau khi sắp xếp: " + sortedArray);
Giải thích:
-
Hàm
mergeSort
:- Nếu mảng có độ dài nhỏ hơn hoặc bằng 1, trả về chính mảng đó (vì nó đã được sắp xếp).
- Tìm điểm giữa của mảng (
mid
). - Chia mảng thành hai nửa:
left
vàright
. - Đệ quy gọi
mergeSort
trên hai nửa. - Kết hợp hai nửa đã sắp xếp bằng hàm
merge
.
-
Hàm
merge
:- Khởi tạo một mảng kết quả trống (
result
). - So sánh từng phần tử của hai mảng
left
vàright
, thêm phần tử nhỏ hơn vàoresult
. - Sau khi một trong hai mảng
left
hoặcright
đã được duyệt hết, thêm các phần tử còn lại của mảng kia vàoresult
.
- Khởi tạo một mảng kết quả trống (
Thời gian và không gian:
- Thời gian: O(n log n) cho tất cả các trường hợp (tốt, trung bình, xấu), vì mỗi lần chia mảng thành hai và sau đó kết hợp chúng lại.
- Không gian: O(n) do sử dụng bộ nhớ phụ để lưu trữ các mảng tạm thời.
Merge Sort là một thuật toán sắp xếp hiệu quả và ổn định, đặc biệt là với các mảng lớn. Tuy nhiên, nó đòi hỏi bộ nhớ bổ sung để lưu trữ các mảng tạm thời trong quá trình kết hợp.
Comments