Princeton1/module7/src/main/java/com/hithomelabs/princeton1/module7/Quick.java
2025-02-18 04:05:28 +05:30

80 lines
2.2 KiB
Java

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<E> implements MeasurableSort<E>, 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<E>) 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<E> 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<E> cmp) {
int N = arr.length;
quickSort(arr, 0, N - 1, cmp, null);
}
public void sort(E[] arr, Comparator<E> cmp, SortingMetaData metaData) {
if(metaData != null){
metaData.startTime();
}
int N = arr.length;
quickSort(arr, 0, N - 1, cmp, metaData);
if (metaData != null)
metaData.endTime();
}
@Override
public String toString() {
return "Quick Sort";
}
}