Java Program to Implement Merge Sort on n Numbers Without tail-recursion

Problem Description

Given an array of integers, sort the array using merge sort algorithm.

Problem Solution

The idea is to divide the array into two equal parts. Recursively sort the two parts of the array and finally merge them.Program/Source Code

Here is the source code of the Java Program to Implement Merge Sort on n Numbers Without tail-recursion. The program is successfully compiled and tested using IDE IntelliJ Idea in Windows 7. The program output is also shown below.

//Java Program to Implement Merge Sort on n Numbers Without tail-recursion
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class MergeSort {
    // Function to merge the two sorted arrays
    static void merge(int[] array,int low,int mid,int high){
        int i,j,k;
        int[] c= new int[high-low+1];
        k = 0;
        i=low;
        j=mid+1;
        while(i<=mid && j<=high){
            if(array[i]<=array[j]){
                c[k++] = array[i++];
            }
            else{
                c[k++] = array[j++];
            }
        }
        while(i<=mid){
            c[k++] = array[i++];
        }
        while(j<=high){
            c[k++] = array[j++];
        }
        k=0;
        for(i = low; i<=high; i++){
            array[i] = c[k++];
        }
    }
    // Function implementing the merge sort
    static void mergeSort(int[] array,int low, int high){
        if(high-low+1>1){
            int mid = (low+high)/2;
            mergeSort(array,low,mid);
            mergeSort(array,mid+1,high);
            merge(array,low,mid,high);
        }
    }
    // Function to read the input and display the output
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int size;
        System.out.println("Enter the size of the array");
        try {
            size = Integer.parseInt(br.readLine());
        } catch (Exception e) {
            System.out.println("Invalid Input");
            return;
        }
        int[] array = new int[size];
        System.out.println("Enter array elements");
        int i;
        for (i = 0; i < array.length; i++) {
            try {
                array[i] = Integer.parseInt(br.readLine());
            } catch (Exception e) {
                System.out.println("An error Occurred");
            }
        }
        System.out.println("The initial array is");
        System.out.println(Arrays.toString(array));
        mergeSort(array,0,array.length-1);
        System.out.println("The sorted array is");
        System.out.println(Arrays.toString(array));
    }
}

Program Explanation

1. In function mergeSort(), first, we check if there is more than one element in the array, through the condition if(high-low+1>1).
2. If that is the case, a recursive call is made on the two halves obtained by dividing the array.
3. In function merge(), the while(i<=mid && j<=high) loop merges the elements of the two array into the new array c.
4. The loops while(i<=mid) and while(j<=high), adds any remaining elements of the arrays, at the end of c.

Time Complexity: O(n*log(n)) where n is the number of elements in the array.

Runtime Test Cases

Case 1 (Simple Test Case):
 
Enter the size of the array
5
Enter array elements
5
4
3
2
1
The initial array is
[5, 4, 3, 2, 1]
The sorted array is
[1, 2, 3, 4, 5]
 
Case 2 (Simple Test Case - another example):
 
Enter the size of the array
8
Enter array elements
4
3
2
1
1
2
3
4
The initial array is
[4, 3, 2, 1, 1, 2, 3, 4]
The sorted array is
[1, 1, 2, 2, 3, 3, 4, 4]

Related posts:

Guide to @ConfigurationProperties in Spring Boot
Java Program to Check whether Undirected Graph is Connected using BFS
Disable DNS caching
Java Concurrency Interview Questions and Answers
Rest Web service: Filter và Interceptor với Jersey 2.x (P2)
Java Program to Implement Max-Flow Min-Cut Theorem
Hướng dẫn Java Design Pattern – Bridge
Converting String to Stream of chars
Java 8 Predicate Chain
StringBuilder vs StringBuffer in Java
Java Program to Check if a Given Set of Three Points Lie on a Single Line or Not
Java Program to Find a Good Feedback Vertex Set
Java program to Implement Tree Set
Java Program to Implement ConcurrentLinkedQueue API
Error Handling for REST with Spring
Java Program to Implement Gabow Algorithm
Introduction to Spring Data JDBC
Hướng dẫn sử dụng lớp Console trong java
Hướng dẫn Java Design Pattern – Template Method
Java Program to Implement the MD5 Algorithm
Spring Cloud Series – The Gateway Pattern
Java Program to Find Hamiltonian Cycle in an UnWeighted Graph
Summing Numbers with Java Streams
Java Program to Implement Hash Tables Chaining with Doubly Linked Lists
A Guide to TreeSet in Java
Lập trình đa luồng trong Java (Java Multi-threading)
HttpClient 4 Cookbook
Java Program to Implement Naor-Reingold Pseudo Random Function
Java Program to Implement the Alexander Bogomolny’s UnOrdered Permutation Algorithm for Elements Fro...
Java Program to implement Associate Array
Build a REST API with Spring and Java Config
Spring Security 5 for Reactive Applications