I have implemented a MergeSorting that takes a Generic Data type and a upper and lower index bound that stops the sorting after it passes those bounds. An example {85,31,321,6549,123,2,1,0} lower = 0 upper = 4 will yield [31,85,123,321,6549,2,1,0]. Although when Im testing my code it is giving a stackoverflow error, and I do not know why.
I have looked through my code and could not find the problem, maybe I do not have a edge case to break out of recursive call.
import java.util.ArrayList;
public class Sorts<T extends Comparable<? super T>> {
public void merge(ArrayList<T> list, int start, int mid, int end)
{
ArrayList<T> tempArr = new ArrayList<T>(end - start);
int leftidx = start;
int rightidx = mid;
while(true)
{
if (leftidx == mid)
{
tempArr.addAll(list.subList(rightidx,end));
break;
}
else if (rightidx == end)
{
tempArr.addAll(list.subList(leftidx, mid));
break;
}
T left = list.get(leftidx);
T right = list.get(rightidx);
int check = left.compareTo(right);
if (check < 0)
{
tempArr.add(left);
leftidx++;
}
else
{
tempArr.add(right);
rightidx++;
}
}
for (int j = 0; j < tempArr.size(); j++)
{
list.set(start + j, tempArr.get(j));
}
}
public void MergeSort(ArrayList<T> list, int start, int end) {
int median = start + (end - start) / 2;
MergeSort(list, start, median);
MergeSort(list, median, end);
merge(list, start, median, end);
}
}
When I run a test, it is giving an error "java.lang.StackOverflowError" at line 82 which is MergeSort(list,start,median) in my mergesort clas. My tester class is:
public class SortsTester extends Sorts{
public void mergeSortTester{
Integer [] arr = {85,31,321,6549,123,2,1,0};
ArrayList<Integer> ranArrLst = new ArrayList<>(Arrays.asList(arr));
MergeSort(ranArrLst,0,7);
System.out.println(Arrays.toString(ranArrLst.toArray()));
}
}