package com.hithomelabs.princeton1.module7; import com.hithomelabs.princeton1.module5.MeasurableHelper; import com.hithomelabs.princeton1.module5.MeasurableSort; import com.hithomelabs.princeton1.module5.SortingMetaData; import java.util.Comparator; public class Quick implements MeasurableSort, MeasurableHelper { @Override public void sort(E[] arr) { int N = arr.length; quickSort(arr, 0, N - 1, null, null); } public void altSort(E[] arr) { int N = arr.length; altQuickSort(arr, 0, N-1); } private void altQuickSort(E[] arr, int lo, int hi) { if (lo >= hi) return; int i = lo + 1; int j = i; while(j <= hi){ if(MeasurableHelper.less((Comparable) arr[j], arr[lo], null, null)){ MeasurableHelper.exch(arr, i, j, null); i++; } j++; } MeasurableHelper.exch(arr, i-1, lo,null); altQuickSort(arr, lo, i-2); altQuickSort(arr, i, hi); } private void quickSort(E[] arr, int lo, int hi, Comparator cmp, SortingMetaData metaData) { if (lo >= hi) return; int i = lo; int j = hi+1; while(true){ while(MeasurableHelper.less( arr[++i], arr[lo], cmp, metaData)){ if(i == hi) break; } while(!MeasurableHelper.less(arr[--j], arr[lo], cmp, metaData)){ if (j == lo ) break; } if(j<=i) break; MeasurableHelper.exch(arr, i , j, metaData); } MeasurableHelper.exch(arr, j, lo, metaData); quickSort(arr, lo, j-1, cmp, metaData); quickSort(arr, j+1, hi, cmp, metaData); } @Override public void sort(E[] arr, Comparator cmp) { int N = arr.length; quickSort(arr, 0, N - 1, cmp, null); } public void sort(E[] arr, Comparator cmp, SortingMetaData metaData) { if(metaData != null){ metaData.startTime(); } int N = arr.length; quickSort(arr, 0, N - 1, cmp, metaData); if (metaData != null) metaData.endTime(); } }