The Founded.in

    About Us

    The Founded.in is dedicated to sharing insights and knowledge on various topics.

    Quick Links

    • Home
    • Categories
    • About
    • Contact

    Categories

    • Technology
    • Education
    • Lifestyle
    • Travel
    • Food

    Follow Us

    © 2025 The Founded.in. All rights reserved.

    Privacy PolicyTerms of Service

    Disclaimer: The content on this blog is provided for informational purposes only and reflects the opinions of the authors. We do not guarantee the accuracy, reliability, or completeness of any information. Any matching functionality within the site is for user convenience only and should not be considered as professional advice or recommendations. External links provided are not endorsed, and we are not responsible for the content of any linked sites. Use of this site and its features is at your own risk. By using this site, you agree to this disclaimer and the terms of service.

    Understanding Merge Sort: A Comprehensive Guide with Advantages, Disadvantages, and Code Samples in C++, Java, and Python

    Merge Sort Explanation

    Merge Sort is a popular and efficient sorting algorithm that uses the divide-and-conquer technique to sort elements. It divides the array into smaller subarrays, sorts them, and then merges them back together in a sorted order. Merge Sort is particularly effective for large datasets and has a stable time complexity, making it a reliable choice for sorting.

    Algorithm Steps:

    1. Divide: Split the array into two halves until each subarray contains a single element (which is inherently sorted).
    2. Conquer: Recursively sort the two halves.
    3. Merge: Combine the sorted halves back together to form a sorted array.

    Advantages:

    • Time complexity of O(nlog⁡n) in all cases (best, average, and worst).
    • Stable sort: maintains the relative order of equal elements.
    • Works well with large datasets and linked lists.

    Disadvantages:

    • Requires additional space proportional to the size of the array (i.e., O(n) space complexity).
    • Slower than some algorithms (like Quick Sort) for small datasets due to overhead.

    Code Examples

    C++ Code:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    // Function to merge two subarrays
    void merge(vector<int>& arr, int left, int mid, int right) {
        int n1 = mid - left + 1;
        int n2 = right - mid;
    
        vector<int> L(n1), R(n2);
    
        // Copy data to temp arrays L[] and R[]
        for (int i = 0; i < n1; i++)
            L[i] = arr[left + i];
        for (int j = 0; j < n2; j++)
            R[j] = arr[mid + 1 + j];
    
        // Merge the temp arrays back into arr[left..right]
        int i = 0, j = 0, k = left;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = R[j];
                j++;
            }
            k++;
        }
    
        // Copy remaining elements of L[] if any
        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }
    
        // Copy remaining elements of R[] if any
        while (j < n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }
    
    // Main function that sorts arr[left..right] using merge()
    void mergeSort(vector<int>& arr, int left, int right) {
        if (left < right) {
            int mid = left + (right - left) / 2;
    
            // Sort first and second halves
            mergeSort(arr, left, mid);
            mergeSort(arr, mid + 1, right);
    
            merge(arr, left, mid, right);
        }
    }
    
    int main() {
        vector<int> arr = {38, 27, 43, 3, 9, 82, 10};
        mergeSort(arr, 0, arr.size() - 1);
        cout << "Sorted array: \n";
        for (int num : arr) {
            cout << num << " ";
        }
        return 0;
    }
    

    Java Code:

    import java.util.Arrays;
    
    public class MergeSort {
        // Function to merge two subarrays
        public static void merge(int[] arr, int left, int mid, int right) {
            int n1 = mid - left + 1;
            int n2 = right - mid;
    
            int[] L = new int[n1];
            int[] R = new int[n2];
    
            // Copy data to temp arrays L[] and R[]
            System.arraycopy(arr, left, L, 0, n1);
            System.arraycopy(arr, mid + 1, R, 0, n2);
    
            // Merge the temp arrays back into arr[left..right]
            int i = 0, j = 0, k = left;
            while (i < n1 && j < n2) {
                if (L[i] <= R[j]) {
                    arr[k] = L[i];
                    i++;
                } else {
                    arr[k] = R[j];
                    j++;
                }
                k++;
            }
    
            // Copy remaining elements of L[] if any
            while (i < n1) {
                arr[k] = L[i];
                i++;
                k++;
            }
    
            // Copy remaining elements of R[] if any
            while (j < n2) {
                arr[k] = R[j];
                j++;
                k++;
            }
        }
    
        // Main function that sorts arr[left..right] using merge()
        public static void mergeSort(int[] arr, int left, int right) {
            if (left < right) {
                int mid = left + (right - left) / 2;
    
                // Sort first and second halves
                mergeSort(arr, left, mid);
                mergeSort(arr, mid + 1, right);
    
                merge(arr, left, mid, right);
            }
        }
    
        public static void main(String[] args) {
            int[] arr = {38, 27, 43, 3, 9, 82, 10};
            mergeSort(arr, 0, arr.length - 1);
            System.out.println("Sorted array: " + Arrays.toString(arr));
        }
    }
    

    Python Code:

    def merge(arr, left, mid, right):
        n1 = mid - left + 1
        n2 = right - mid
    
        L = arr[left:mid + 1]
        R = arr[mid + 1:right + 1]
    
        i = j = 0
        k = left
    
        # Merge the temp arrays back into arr[]
        while i < n1 and j < n2:
            if L[i] <= R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
    
        # Copy remaining elements of L[]
        while i < n1:
            arr[k] = L[i]
            i += 1
            k += 1
    
        # Copy remaining elements of R[]
        while j < n2:
            arr[k] = R[j]
            j += 1
            k += 1
    
    def merge_sort(arr, left, right):
        if left < right:
            mid = left + (right - left) // 2
    
            # Sort first and second halves
            merge_sort(arr, left, mid)
            merge_sort(arr, mid + 1, right)
    
            merge(arr, left, mid, right)
    
    arr = [38, 27, 43, 3, 9, 82, 10]
    merge_sort(arr, 0, len(arr) - 1)
    print("Sorted array:", arr)
    

    Time Complexity:

    • Best case: O(nlog⁡n)
    • Average case: O(nlog⁡n)
    • Worst case: O(nlog⁡n)

    Merge Sort is particularly effective for sorting linked lists and can be implemented easily in parallel systems. Its stability and predictable time complexity make it a strong choice for many applications.