I have an assignment about modifying Cormen's merge sort algorithm into a 3 way merge. My instructor does not like outside book materials, so I am strictly abiding by cormen's algorithm. Now, I have tried to do that, but how ever it shows something like this
Exception in thread "main" java.lang.NegativeArraySizeException: -1
at Algorithms.Mergemod.merge(Mergemod.java:10)
at Algorithms.Mergemod.mergeSort(Mergemod.java:60)
at Algorithms.Mergemod.mergeSort(Mergemod.java:58)
at Algorithms.Mergemod.mergeSort(Mergemod.java:59)
at Algorithms.Mergemod.mergeSort(Mergemod.java:58)
at Algorithms.Mergemod.main(Mergemod.java:83)
I have tried the debugger and there in the mergeSort function I see r holds value sometimes 1, sometimes 3 and not 11. Here is my confusion why r would hold 1 or 3 and not 11. I have passed the last index of the array as r in the function.
My code:
package Algorithms;
import java.util.Scanner;
public class Mergemod {
static void merge(int [] A, int p, int q, int t, int r ){
int n1 = q-p+1;
int n2 = t-q;
int n3 = r-t;
int [] L = new int[n1];
int [] M = new int[n2];
int [] R = new int[n3];
//inserting values from A to L
for (int i = 0; i < L.length; i++) {
L[i] = A[p+i];
}
//inserting values from A to M
for (int j = 0; j < M.length; j++) {
M[j] = A[q+j+1];
}
//inserting values from A to R
for (int k = 0; k < R.length; k++) {
R[k] = A[t+k+1];
}
int i = 0 , j = 0, k = 0, l;
//sorting and merging
for (l = p; l <=r && i<n1 && j<n2 && k<n3; l++) {
if(L[i]<=M[j] && L[i]<=R[k]){
A[l] = L[i];
i++;
}
else if(M[j]<=L[i] && M[j]<=R[k]){
A[l] = M[j];
j++;
}
else{
A[l] = R[k];
k++;
}
}
while(i<n1){
A[l++] = L[i++];
}
while(j<n2){
A[l++] = M[j++];
}
while(k<n3){
A[l++] = R[k++];
}
}
static void mergeSort(int [] A, int p, int r){
if(p<r)
{ int q = (p+r)/3;
int t = (q+1+r)/2;
mergeSort(A, p, q);
mergeSort(A, q+1, t);
mergeSort(A, t+1, r);
merge(A, p, q, t, r);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the size of the array: ");
int [] arr = new int [sc.nextInt()];
System.out.println("Enter numbers : 11 5 20 3 4 8 0 15 2 13 1 6");
for (int i = 0; i < arr.length; i++) {
arr[i]= sc.nextInt();
}
System.out.println("Before merge sort");
for (var x : arr) {
System.out.print(x+" ");
}
int firstIndex = 0;
int lastIndex = arr.length-1;
System.err.println(" ");
System.out.println("After merge sort ");
mergeSort(arr, firstIndex, lastIndex);
for (var k : arr) {
System.out.print(k+" ");
}
sc.close();
}
}
I do not know if my logic is correct or not but if anybody would help me out that would mean so much. Also I am not very good in java, so sorry for if there is any readability issue. Thanks!