package practice.algorithm.sort;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public abstract class QuickSort {
private static boolean asc = true;
public static Comparable[] quickSort(Comparable[] arr) {
return quickSort(arr, true);
}
public static Comparable[] quickSort(Comparable[] arr, boolean ascend) {
if (arr == null || arr.length == 0) {
return arr;
}
asc = ascend;
qSort(arr, 0, arr.length - 1);
return arr;
}
public static void qSort(Comparable[] arr, int low, int high) {
if (low < high) {
int pivotLocation = partition(arr, low, high);
qSort(arr, low, pivotLocation - 1);
qSort(arr, pivotLocation + 1, high);
}
}
private static int partition(Comparable[] arr, int low, int high) {
Comparable target = arr[low];
while(low < high) {
while(low < high && (asc ? arr[high].compareTo(target) >= 0
: arr[high].compareTo(target) <= 0)) high--;
arr[low] = arr[high];
while(low < high && (asc ? arr[low].compareTo(target) <= 0
: arr[low].compareTo(target) >= 0)) low++;
arr[high] = arr[low];
}
arr[low] = target;
return low;
}
// -------- Test Code --------
private static Integer[] generateArray(int num) {
Set<Integer> set = new HashSet<Integer>();
Random rand = new Random(new Date().getTime());
int max = num * 10;
for (int i = 0; i < num;) {
int n = rand.nextInt(max);
if (set.contains(n))
continue;
set.add(n);
i++;
}
return set.toArray(new Integer[num]);
}
public static void main(String[] args) {
Integer[] ints = generateArray(100);
System.out.println("======== Quick Sort ========");
System.out.println("Before : " + Arrays.toString(ints));
long timeBefore = System.nanoTime();
QuickSort.quickSort(ints);
long timeAfter = System.nanoTime();
System.out.println("After : " + Arrays.toString(ints));
System.out.println("Time Elapsed : [" + (timeAfter - timeBefore) + "] nano secondes.");
}
}