package com.bao.sort; import com.bao.sort.SortUtil.Sort; public class TestQSort implements Sort { @Override public void sort(int[] data) { sort(data, 0, data.length - 1); } private static void sort(int[] array, int i, int j) { if(i >= j) { return; } int pivotIndex = i + (j - i)/20; pivotIndex = SortUtil.mid3(array, i, j, (i + j) / 2); SortUtil.logSwap(array, pivotIndex, j); //stick pivot at end SortUtil.swap(array, pivotIndex, j); //k wiil be the first position in the right subarray int k = partition(array, i, j - 1, array[j]); SortUtil.logSwap(array, k, j); SortUtil.swap(array, k, j); if((k - i) > 1) { sort(array, i, k - 1); } if((j - k) > 1) { sort(array, k + 1, j); } } public static int partition(int[] array, int i, int j, int pivot) { SortUtil.logPartitionStart(array, i, j, pivot); /* if(i == j) { if(array[i] <= pivot) { return i + 1; } else { return i; } } */ int lo = i, hi = j; while(lo <= hi) { while(lo <= hi && array[lo] < pivot) { lo++; } while(lo <= hi && array[hi] > pivot) { hi--; } if(lo <= hi) { SortUtil.logSwap(array, lo, hi); SortUtil.swap(array, lo, hi); lo++; hi--; } } SortUtil.logPartition(array, i, j, lo, hi); return lo; } }