自从用了java排序基本上就是E.sort().. 今天需要自己实现一下排序, 居然费了半天劲.. 郁闷, 基础真的不扎实啊.. 写了个简单的数组快速排序总结复习一下, 随便贴上来得了. 希望过路的朋友指正.
另外, wikipedia介绍qicksort的条目还是比较详细的.
http://zh.wikipedia.org/w/index.php?title=快速排序&variant=zh-tw
快速排序是典型的使用分治策略的一种交换排序.
一次排序步骤:
得到中心点作为关键点(其他的得到关键点的方法要根据排序数组来决定, 由于关键点是用来比较的基准所以如果基准选择得当可以减少交换的次数, 从而提高算法效率 , 是比较有技巧的部分), 以该关键点元素作为基准, 从数组两头分别与之比较, 大的放右边,小的放左边,相等的无论哪边都成(干脆不动). 最后当遍历完数组一遍(即两头的标志指向同一个数组元素)时把关键点元素放到该位置(此时确定这里为分治点 ),完成一次排序.
对关键点左右两个子序列递归调用, 以子序列小于两个元素为退出递归条件. 完成整个数组的排序.
public class Quicksort { private int getPivot(int begin, int end) { return (begin + end) >> 1; } // 一次排序 private int partition(int[] array, int begin, int end) { int pivot = getPivot(begin, end); int tmp = array[pivot]; array[pivot] = array[end]; while (begin != end) { while (array[begin] < tmp && begin < end) begin++; if (/* array[begin] > tmp && */begin < end) { array[end] = array[begin]; end--; } while (array[end] > tmp && end > begin) end--; if (/* array[end] < tmp && */end > begin) { array[begin] = array[end]; begin++; } } // 此时两个下标指向同一个元素.以这个位置左右分治(分治点) array[begin] = tmp; return begin; } private void qsort(int[] array, int begin, int end) { if (end - begin < 1) return; int pivot = partition(array, begin, end); qsort(array, begin, pivot); qsort(array, pivot + 1, end); } public void sort(int[] array) { qsort(array, 0, array.length - 1); } public static void main(String[] args) { int[] array = { 3, 2, 2, 2, 3, 1, 4, 5, 1 }; new Quicksort().sort(array); for (int i = 0; i < array.length; i++) { System.out.print(array[i] + ", "); } } }