wiki解释:
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
分治法:
分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
步骤:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
public static void quickSort(int[] a, int left, int right) {
int low = left;
int high = right;
int p = a[right];
int blank = right;
//循环一轮,最左的放到基数左边,最右的放到基数右边。
while ( low < high ) {
//从左往右找比基数大的数。
while (low < high && a[low] < p) {
low++;
}
//判断low位置上的数是否比基数大,是的话就把low位置上的数和基数为进行交换,并且保存,空出来的位置。
if(a[low] > p) {
a[high] = a[low];
blank = low;
}
//从右往左找比基数小的数。
while (high > low && a[high] > p) {
--high;
}
if(a[high] < p){
a[low] = a[high];
blank = high;
}
}
//第一轮结束后,最后把基数填到最后一个最后空出来的位置上。
a[blank] = p;
//low是否到了数组的最左边,是的话表示左边的数组都排序好了。
if(low > left){
quickSort(a,left,low-1);
}
//high位置是否到了数组的最右边,是的话表示右边的数组都排序好了。
if(high < right){
//右边排序
quickSort(a,high+1,right);
}
}