package com.interview.leetcode.arrays;
import com.interview.utils.ArrayUtil;
/**
* Created_By: stefanie
* Date: 14-11-29
* Time: 下午5:08
*/
public class QuickSort {
static class QuickSortThreeWay{
protected void sort(int[] input, int low, int high) {
if (low >= high) return;
int i = low;
int m = -1;
for (int j = low + 1; j <= high; j++) {
if (input[j] == input[low]) {
if (m == -1) m = i;
if (++m != j) ArrayUtil.swap(input, m, j);
} else if (input[j] < input[low] && ++i != j) {
ArrayUtil.swap(input, i, j);
if (m > -1 && ++m< j) ArrayUtil.swap(input, m, j);
}
}
if(low != i) ArrayUtil.swap(input, low, i);
sort(input, low, i - 1);
sort(input, m > -1 ? m + 1 : i + 1, high);
}
}
static class QuickSortDualPivots{
protected void sort(int[] input, int low, int high){
if (low >= high) return;
if(input[low] > input[high]) ArrayUtil.swap(input, low, high);
int i = low;
int m = -1;
for (int j = low + 1; j < high; j++) {
if (input[j] < input[low] && ++i != j) {
ArrayUtil.swap(input, i, j);
if (m > -1 && ++m < j) ArrayUtil.swap(input, m, j);
} else if (input[j] >= input[low] && input[j] <= input[high]) {
if (m == -1) m = i;
if (++m != j) ArrayUtil.swap(input, m, j);
}
}
if(low != i) ArrayUtil.swap(input, low, i);
sort(input, low, i - 1);
if(m != -1) {
if(++m != high) ArrayUtil.swap(input, high, m);
sort(input, i + 1, m - 1);
sort(input, m + 1, high);
} else {
sort(input, i + 1, high);
}
}
}
}