diff --git a/src/sandbox/GeneralCompare.java b/src/sandbox/GeneralCompare.java index 29332aa981890f0b026d7bc1bdca632304f21563..9e7584c7399a163c5ff6ef9ec6c98829ce1735dc 100644 --- a/src/sandbox/GeneralCompare.java +++ b/src/sandbox/GeneralCompare.java @@ -1,5 +1,6 @@ package sandbox; -public interface GeneralCompare<T> { - public int eval(T a1, T a2); +public interface GeneralCompare { + public int eval(Comparable a1, Comparable a2); + } diff --git a/src/sort/GeneralCompare.java b/src/sort/GeneralCompare.java index 76bf31fcb3c9bc9bbc5c0f8044ffa4dd3449f386..b5d51afd5339dd7d9fafe3cf1ccb308f5742386f 100644 --- a/src/sort/GeneralCompare.java +++ b/src/sort/GeneralCompare.java @@ -1,5 +1,5 @@ package sort; -public interface GeneralCompare<T> { - public int compare(T a1, T a2); +public interface GeneralCompare { + public int compare(Comparable a1, Comparable a2); } diff --git a/src/sort/MergeSort.java b/src/sort/MergeSort.java index b3c7db4a6022fafba612c79f8f87208e5cc3a54c..591ee8cd9bd91e08524f1d04f5c4ad02120bea92 100644 --- a/src/sort/MergeSort.java +++ b/src/sort/MergeSort.java @@ -1,35 +1,59 @@ package sort; +import java.lang.reflect.Array; + public class MergeSort{ - + private static Comparable[] aux; - public static void merge(Comparable[] x, int lo, int hi, GeneralCompare gc){ + public static void main(String[] args) { + GeneralCompare b1; + b1 = (a1, a2) -> (Integer) a1 - (Integer) a2; + Integer[] test = {3, 4, 2, 1, 5, 7, 9, 10}; + sort(test, 0, Array.getLength(test) - 1, b1); - int n = hi - lo; - aux = new Comparable[n]; + for (int i = 0 ; i < (Array.getLength(test) - 1) ; i++) { + System.out.println(test[i]); + } + } + public static void sort(Comparable[] x, int lo, int hi, GeneralCompare gc) { + aux = new Comparable[Array.getLength(x)]; + sortWrapped(x, 0, Array.getLength(x) - 1, gc); + } + + private static void sortWrapped(Comparable[] x, int lo, int hi, GeneralCompare gc) { + int n = hi - lo; if(n <= 1) return; - // Recursively merge each half of the array - int mid = (n/2) + 1; - merge(x, lo, mid, gc); - merge(x, mid+1, hi, gc); - + // Recursively sort each half of the array + int mid = lo + (n/2); + sortWrapped(x, lo, mid, gc); + sortWrapped(x, mid+1, hi, gc); + merge(x, lo, hi, gc); + } + + private static void merge(Comparable[] x, int lo, int hi, GeneralCompare gc){ + + int n = hi - lo; + int mid = lo + (n/2); + // Fill auxiliary array - for(int k = 1; k <= n; k++){ + System.out.println(n); + for(int k = lo; k <= hi; k++){ aux[k] = x[k]; } - - // - while ((mid < hi) | (lo < mid)) { - if (compare(aux[lo], aux[mid])) - x[lo++] = mid; - + + int i = 0; + // Merging two sorted arrays + while ((lo <= mid) & (mid <= hi)) { + if (gc.compare(aux[lo], aux[mid]) > 0) + x[i++] = aux[mid++]; + else + x[i++] = aux[lo++]; } - - - + + /* // Is this portion sorting the aux array? Check for(int k = 1; k <= n; k++){ if(i > j-1) @@ -40,9 +64,7 @@ public class MergeSort{ x[k] = aux[j++]; else x[k] = aux[i++]; - } - - } - + }*/ + } }