I am new to Java and have tried to implement mergesort in Java. However, even after running the program several times, instead of the desired sorted output, I am getting the same user given input as the output. I would be thankful if someone could help me understand this unexpected behaviour.
import java.io.*; import java.util.Arrays; public class MergeSort { public static void main(String[] args) throws IOException { BufferedReader R = new BufferedReader(new InputStreamReader(System.in)); int arraySize = Integer.parseInt(R.readLine()); int[] inputArray = new int[arraySize]; for (int i = 0; i < arraySize; i++) { inputArray[i] = Integer.parseInt(R.readLine()); } mergeSort(inputArray); for (int j = 0; j < inputArray.length; j++) { System.out.println(inputArray[j]); } } static void mergeSort(int[] A) { if (A.length > 1) { int q = A.length / 2; int[] leftArray = Arrays.copyOfRange(A, 0, q); int[] rightArray = Arrays.copyOfRange(A, q + 1, A.length); mergeSort(leftArray); mergeSort(rightArray); A = merge(leftArray, rightArray); } } static int[] merge(int[] l, int[] r) { int totElem = l.length + r.length; int[] a = new int[totElem]; int i, li, ri; i = li = ri = 0; while (i < totElem) { if ((li < l.length) && (ri < r.length)) { if (l[li] < r[ri]) { a[i] = l[li]; i++; li++; } else { a[i] = r[ri]; i++; ri++; } } else { if (li >= l.length) { while (ri < r.length) { a[i] = r[ri]; i++; ri++; } } if (ri >= r.length) { while (li < l.length) { a[i] = l[li]; li++; i++; } } } } return a; } }
Advertisement
Answer
Here is a corrected version of your code:
import java.io.*; import java.util.Arrays; public class MergeSort { public static void main(String[] args) throws IOException{ BufferedReader R = new BufferedReader(new InputStreamReader(System.in)); int arraySize = Integer.parseInt(R.readLine()); int[] inputArray = new int[arraySize]; for (int i = 0; i < arraySize; i++) { inputArray[i] = Integer.parseInt(R.readLine()); } mergeSort(inputArray); for (int j = 0; j < inputArray.length; j++) { System.out.println(inputArray[j]); } } static void mergeSort(int[] A) { if (A.length > 1) { int q = A.length/2; //changed range of leftArray from 0-to-q to 0-to-(q-1) int[] leftArray = Arrays.copyOfRange(A, 0, q-1); //changed range of rightArray from q-to-A.length to q-to-(A.length-1) int[] rightArray = Arrays.copyOfRange(A,q,A.length-1); mergeSort(leftArray); mergeSort(rightArray); merge(A,leftArray,rightArray); } } static void merge(int[] a, int[] l, int[] r) { int totElem = l.length + r.length; //int[] a = new int[totElem]; int i,li,ri; i = li = ri = 0; while ( i < totElem) { if ((li < l.length) && (ri<r.length)) { if (l[li] < r[ri]) { a[i] = l[li]; i++; li++; } else { a[i] = r[ri]; i++; ri++; } } else { if (li >= l.length) { while (ri < r.length) { a[i] = r[ri]; i++; ri++; } } if (ri >= r.length) { while (li < l.length) { a[i] = l[li]; li++; i++; } } } } //return a; } }