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:

Java Program to Check whether Undirected Graph is Connected using DFS
Call Methods at Runtime Using Java Reflection
Spring Boot - Admin Client
Guide to the Synchronized Keyword in Java
Spring Boot - OAuth2 with JWT
Java Program to Implement HashMap API
Java Program to Implement Bucket Sort
Java Program to Check Whether a Directed Graph Contains a Eulerian Path
Java – Reader to InputStream
Spring WebFlux Filters
Một số tính năng mới về xử lý ngoại lệ trong Java 7
Java Program to Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Java Program to Permute All Letters of an Input String
Java Program to Describe the Representation of Graph using Incidence List
Using JWT with Spring Security OAuth (legacy stack)
Java Program to Implement RenderingHints API
Java Program to Implement Sorted Circular Doubly Linked List
Spring Boot: Customize the Jackson ObjectMapper
Introduction to Spring Cloud OpenFeign
Java Program to Implement LinkedBlockingQueue API
HttpAsyncClient Tutorial
HandlerAdapters in Spring MVC
Java Program to Implement Interpolation Search Algorithm
Java Program to Implement Booth Algorithm
Easy Ways to Write a Java InputStream to an OutputStream
Introduction to the Functional Web Framework in Spring 5
Java Program to Implement Cartesian Tree
Hướng dẫn Java Design Pattern – Bridge
Java Program to Find k Numbers Closest to Median of S, Where S is a Set of n Numbers
Java Program to Implement Ternary Search Algorithm
Queue và PriorityQueue trong Java
Lớp HashMap trong Java