I have written a method to merge sort an array of values. Method works perfectly but I am trying to show the number of comparisons and exchanges that have taken place. My first thought was to create static variables (int comparisons, int exchanges) and pass them into the method. however am running into problems returning them from the helper method. Is it possible to return an int[] and two ints in the same method? If not, how can I determine the number of comparisons and exchanges that have taken place?
Here are my mergeSort and merge methods:
public static int[] mergeSort(int[] A, int comps, int exchs) {
// Array has only 1 element
if( A.length <= 1 ) {
return A;
}
int midPoint = A.length / 2;
// Initialize left and right arrays.
int[] left = new int[midPoint];
int[] right = new int[A.length - midPoint];
System.arraycopy(A, 0, left, 0, midPoint);
System.arraycopy(A, midPoint, right, 0, A.length - midPoint);
//recursively sort left and right arrays
left = mergeSort(left, comps, exchs);
right = mergeSort(right, comps, exchs);
System.out.println("Comparisons" + comps);
System.out.println("Exchanges" + exchs);
return merge(left, right, comps, exchs);
}
private static int[] merge(int[] left, int[] right, int comps, int exchs){
// Initialize the result array.
int[] res = new int[left.length + right.length];
// Initialize the array indexes.
int leftIndex = 0;
int rightIndex = 0;
int resIndex = 0;
// compare each element and merge results
while(leftIndex < left.length && rightIndex < right.length){
if(left[leftIndex] > right[rightIndex]){
res[resIndex] = right[rightIndex];
exchs++;
rightIndex++;
} else {
res[resIndex] = left[leftIndex];
exchs++;
leftIndex++;
}
comps++;
resIndex++;
}
comps++;
// Append remainder of left array into the result array.
while(leftIndex < left.length){
res[resIndex] = left[leftIndex];
exchs++;
leftIndex++;
resIndex++;
}
comps++;
// Append whatever is left from the right array into the result array.
while(rightIndex < right.length) {
res[resIndex] = right[rightIndex];
exchs++;
rightIndex++;
resIndex++;
}
comps++;
return res; // want to return comparisons and exchanges to mergeSort method
}
Create an object that does the sorting for you. Then it could store the
compsandexchsand you can just access them with a getter method…