package com.bao.sort; import java.util.Stack; import com.bao.sort.SortUtil.Sort; public class StackQSort implements Sort { private static class Range { public int x; public int y; public Range(int x, int y) { this.x = x; this.y = y; } } @Override public void sort(int[] data) { sort(data, 0, data.length - 1); } public void sort(int[] data, int low, int high) { if(low >= high) { return; } Stack<Range> stack = new Stack<Range>(); Range range = new Range(low, high); stack.push(range); int i, j, k; while(!stack.isEmpty()) { range = stack.pop(); i = range.x; j = range.y; int pivotIndex = SortUtil.mid3(data, i, j, (i + j) / 2); SortUtil.swap(data, pivotIndex, j); k = partition(data, i, j - 1, data[j]); SortUtil.swap(data, k, j); if((k - i) > 1) { range = new Range(i, k - 1); stack.push(range); } if((j - k) > 1) { range = new Range(k + 1, j); stack.push(range); } } } private int partition(int[] a, int low, int high, int pivot) { int lo = low, hi = high; while(lo <= hi) { while(lo <= hi && a[lo] < pivot) { lo++; } while(lo <= hi && a[hi] > pivot) { hi--; } if(lo <= hi) { SortUtil.swap(a, lo, hi); lo++; hi--; } } return lo; } }