hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Cấu trúc dữ liệu và giải thuật
    • Lập Trình C# Cơ Bản
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Cấu trúc dữ liệu và giải thuật
  • Thuật toán sắp xếp
Sắp xếp trộn – Merge Sort

Sắp xếp trộn – Merge Sort

  • 23-09-2024
  • Toanngo92
  • 0 Comments

Mục lục

  • Giới Thiệu
  • Ý Tưởng
  • Ví Dụ
  • Đánh Giá Thuật Toán Sắp Xếp Trộn
  • Cách sử dụng:

Giới Thiệu

Thuật toán Sắp xếp Trộn (Merge Sort) là một trong những thuật toán sắp xếp dựa trên phương pháp chia để trị, được biết đến với tính ổn định và hiệu quả cao. Thuật toán này được phát triển bởi John von Neumann vào năm 1945 và là một trong những phương pháp sắp xếp rất được ưa chuộng nhờ vào hiệu suất ổn định và khả năng hoạt động tốt với các dãy dữ liệu lớn.

Ý Tưởng

Thuật toán Sắp xếp Trộn hoạt động bằng cách chia mảng thành hai nửa, sắp xếp từng nửa một cách độc lập và sau đó trộn hai nửa đã được sắp xếp thành một mảng hoàn chỉnh. Quy trình chia và trộn này được thực hiện đệ quy cho đến khi mảng được chia thành các phần tử đơn lẻ, rồi các phần tử này được trộn lại để tạo thành mảng đã được sắp xếp.

Ví Dụ

Dưới đây là một ví dụ về thuật toán Sắp xếp Trộn được triển khai bằng Java:

public class MergeSortExample {
    // Phương thức để thực hiện sắp xếp trộn
    public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;

            // Sắp xếp nửa bên trái và bên phải
            mergeSort(arr, left, mid);
            mergeSort(arr, mid + 1, right);

            // Trộn hai nửa đã được sắp xếp
            merge(arr, left, mid, right);
        }
    }

    // Phương thức để trộn hai nửa của mảng
    private static void merge(int[] arr, int left, int mid, int right) {
        int n1 = mid - left + 1;
        int n2 = right - mid;

        // Tạo các mảng tạm để lưu các phần tử
        int[] leftArray = new int[n1];
        int[] rightArray = new int[n2];

        // Sao chép dữ liệu vào các mảng tạm
        for (int i = 0; i < n1; ++i) leftArray[i] = arr[left + i];
        for (int j = 0; j < n2; ++j) rightArray[j] = arr[mid + 1 + j];

        // Trộn các mảng tạm trở lại vào mảng gốc
        int i = 0, j = 0;
        int k = left;
        while (i < n1 && j < n2) {
            if (leftArray[i] <= rightArray[j]) {
                arr[k] = leftArray[i];
                i++;
            } else {
                arr[k] = rightArray[j];
                j++;
            }
            k++;
        }

        // Sao chép các phần tử còn lại của leftArray (nếu có)
        while (i < n1) {
            arr[k] = leftArray[i];
            i++;
            k++;
        }

        // Sao chép các phần tử còn lại của rightArray (nếu có)
        while (j < n2) {
            arr[k] = rightArray[j];
            j++;
            k++;
        }
    }

    // Phương thức để in mảng
    public static void printArray(int[] arr) {
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] array = {64, 25, 12, 22, 11};

        System.out.println("Mảng ban đầu:");
        printArray(array);

        mergeSort(array, 0, array.length - 1);

        System.out.println("Mảng sau khi sắp xếp:");
        printArray(array);
    }
}

Đánh Giá Thuật Toán Sắp Xếp Trộn

Độ phức tạp thuật toán:

  • Trường hợp tốt: O(n log n)
  • Trung bình: O(n log n)
  • Trường hợp xấu: O(n log n)

Không gian bộ nhớ sử dụng: O(n) (Do cần thêm bộ nhớ để lưu trữ các mảng tạm trong quá trình trộn)

Tại chỗ (In-place): Không (Cần bộ nhớ phụ để lưu các mảng tạm)

Cách sử dụng:

Sắp xếp trộn thường được áp dụng trong các tình huống sau:

  • Dữ liệu đầu vào lớn: Khi làm việc với các mảng lớn, thuật toán này cung cấp hiệu suất ổn định và tốt hơn nhiều thuật toán khác như sắp xếp nổi bọt hoặc sắp xếp chọn.
  • Yêu cầu sắp xếp ổn định: Khi cần đảm bảo rằng các phần tử có giá trị giống nhau giữ nguyên thứ tự tương đối của chúng sau khi sắp xếp.
  • Dữ liệu không thể lưu trữ hoàn toàn trong bộ nhớ: Khi làm việc với dữ liệu lớn hơn bộ nhớ chính, thuật toán có thể được điều chỉnh để hoạt động hiệu quả với các phần dữ liệu nhỏ hơn.

Sắp xếp trộn là một lựa chọn mạnh mẽ cho các ứng dụng cần một thuật toán sắp xếp ổn định và hiệu quả với các dãy dữ liệu lớn, mặc dù nó yêu cầu bộ nhớ phụ để lưu trữ các mảng tạm trong quá trình sắp xếp.

Bài viết liên quan:

Cấu trúc dữ liệu danh sách liên kết (LinkedList)
Cấu trúc dữ liệu Mảng (Array)
Giới thiệu về thuật toán
Định lý thợ (Master Theorem)
Giải thuật Qui hoạch động (Dynamic Programming) 
Giải thuật chia để trị (Divide and Conquer)
Phân tích tiệm cận trong CTDL và giải thuật
Giải thuật tham lam (Greedy Algorithm)
Đệ quy trong lập trình
Thuật toán tìm kiếm nhảy – Jump Search
Thuật toán tìm kiếm nhị phân – binary search
Thuật toán tìm kiếm tuần tự – linear search

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

KHÁI NIỆM QUẢN LÝ DỰ ÁN CÔNG NGHỆ THÔNG TIN (IT PROJECT MANAGEMENT)

Cấu trúc lập trình và Mảng

Bắt đầu với C#

1. GIỚI THIỆU KHÁI NIỆM CHUẨN MỰC – ĐẠO ĐỨC VÀ VẤN ĐỀ NGHỀ NGHIỆP TRONG CNTT

2. ÁP DỤNG CÁC CHUẨN MỰC VÀ VẤN ĐỀ NGHỀ NGHIỆP TRONG CNTT

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×