package com.hithomelabs.princeton1.module6; import com.hithomelabs.princeton1.module5.AbstractCustomSorts; import java.util.Arrays; public class Merge extends AbstractCustomSorts { @Override public void sort(E[] arr) { merge_sort(arr, 0, arr.length-1); } private void merge_sort(E[] arr, int low_index, int high_index){ if(high_index - low_index > 0) { int mid_index = low_index + (high_index - low_index)/2; merge_sort(arr, low_index, mid_index); merge_sort(arr, mid_index + 1, high_index); // Copy array E[] auxArr = (E[]) new Object[high_index - low_index + 1]; int index = 0; for(int i=low_index; i<= high_index; i++) auxArr[index++] = arr[i]; // Sort int low_index_ptr = 0; int mid_index_ptr = (auxArr.length - 1)/2; int high_index_ptr = mid_index_ptr + 1; if(!less((Comparable) auxArr[mid_index_ptr], auxArr[high_index_ptr])) { for (int i = low_index; i <= high_index; i++) { if (low_index_ptr > mid_index_ptr) { arr[i] = auxArr[high_index_ptr]; high_index_ptr++; } else if (high_index_ptr >= auxArr.length) arr[i] = auxArr[low_index_ptr++]; else if (less((Comparable) auxArr[low_index_ptr], auxArr[high_index_ptr])) arr[i] = auxArr[low_index_ptr++]; else arr[i] = auxArr[high_index_ptr++]; } } } } }