// MergeSort.java // Declare the MergeSort class, which implements the Sortable interface class MergeSort implements Sortable { // Implement the "sort" method required by the Sortable interface public void sort(int[] array) { mergeSort(array, 0, array.length - 1); } // Helper method for the MergeSort algorithm private void mergeSort(int[] array, int low, int high) { if (low < high) { // Calculate the middle index int mid = (low + high) / 2; // Recursively sort the left and right sub-arrays mergeSort(array, low, mid); mergeSort(array, mid + 1, high); // Merge the sorted sub-arrays merge(array, low, mid, high); } } // Helper method to merge two sub-arrays private void merge(int[] array, int low, int mid, int high) { // Calculate the sizes of the left and right sub-arrays int leftSize = mid - low + 1; int rightSize = high - mid; // Create temporary arrays to hold the left and right sub-arrays int[] leftArray = new int[leftSize]; int[] rightArray = new int[rightSize]; // Copy elements from the original array to the left and right sub-arrays for (int i = 0; i < leftSize; i++) { leftArray[i] = array[low + i]; } for (int i = 0; i < rightSize; i++) { rightArray[i] = array[mid + 1 + i]; } int i = 0, j = 0, k = low; // Merge the two sub-arrays back into the original array while (i < leftSize && j < rightSize) { if (leftArray[i] >= rightArray[j]) { array[k] = leftArray[i]; i++; } else { array[k] = rightArray[j]; j++; } k++; } // Copy any remaining elements from the left and right sub-arrays while (i < leftSize) { array[k] = leftArray[i]; i++; k++; } while (j < rightSize) { array[k] = rightArray[j]; j++; k++; } } }