×

Triển khai Merge Sort trong JavaScript Ý tưởng và mã nguồn

 

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:

  1. 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: leftright.
    • Đệ 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.
  2. 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 leftright, thêm phần tử nhỏ hơn vào result.
    • Sau khi một trong hai mảng left hoặc right đã được duyệt hết, thêm các phần tử còn lại của mảng kia vào result.

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