/** * 改进后的快速排序: * */ public class ImprovedQuickSort { private static int MAX_STACK_SIZE = 4096; private static int THRESHOLD = 10; public void sort(int[] data) { int[] stack = new int[MAX_STACK_SIZE]; int top = -1; int pivot; int pivotIndex, l, r; stack[++top] = 0; stack[++top] = data.length - 1; while (top > 0) { int j = stack[top--]; int i = stack[top--]; pivotIndex = (i + j) / 2; pivot = data[pivotIndex]; swap(data, pivotIndex, j); // partition l = i - 1; r = j; do { while (data[++l] < pivot) ; while ((r != 0) && (data[--r] > pivot)) ; swap(data, l, r); } while (l < r); swap(data, l, r); swap(data, l, j); if ((l - i) > THRESHOLD) { stack[++top] = i; stack[++top] = l - 1; } if ((j - l) > THRESHOLD) { stack[++top] = l + 1; stack[++top] = j; } } // new InsertSort().sort(data); insertSort(data); } /** * @param data */ private void insertSort(int[] data) { for (int i = 1; i < data.length; i++) { for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) { swap(data, j, j - 1); } } } private void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } }
/** * 快速排序: * */ public class QuickSort { public void sort(int[] data) { quickSort(data, 0, data.length - 1); } private void quickSort(int[] data, int i, int j) { int pivotIndex = (i + j) / 2; // swap swap(data, pivotIndex, j); int k = partition(data, i - 1, j, data[j]); swap(data, k, j); if ((k - i) > 1) quickSort(data, i, k - 1); if ((j - k) > 1) quickSort(data, k + 1, j); } /** * @param data * @param l * @param r * @param pivot * @return */ private int partition(int[] data, int l, int r, int pivot) { do { while (data[++l] < pivot) ; while ((r != 0) && data[--r] > pivot) ; swap(data, l, r); } while (l < r); swap(data, l, r); return l; } private void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } }