在待排元素中找出一个基准元素,而后比较基准元素和其余元素,以基准元素为基准,将大于准的元素的放后边,小于
基准的元素放前边。而后再对分好的左右两个小区间进行快速排序
以基准元素划分区间的方式有如下2种:
第一种:设两个参考变量less,great,less先从第一个元素开始日后遍历,直到找到的当前元素大于基准元素。
而后让great从最后一个元素开始往前遍历,直到找到当前元素小于基准元素,交换当前less和great指向的值。
再接着从less开始,重复上述动做,遍历结束的条件是less>=great;
遍历结束后,交换当前less(或great)指向的值与基准元素的值。再进行下一次的小区间内的查找java
注意:新划分的两个区间的范围是:
第一段:本来的left到上一轮基准元素最终位置的前一位;即[left,pivotIndex-1]
第二段:上一轮基准元素最终位置的后一位到本来的right;即[pivotIndex+1,right]
最终结果: 数组
public static void quickSort ( int[] array){ int left = 0; int right = array.length - 1; quickSortInternal1(array, left, right); } public static void quickSortInternal ( int[] array, int left, int right){ if (left >= right) { return; } int pivotIndex = partion1(array, left, right);//找基准值的函数 // int[] indice=partion4(array,left,right); // quickSortInternal(array,left,indice[0]-1); // quickSortInternal(array,indice[1]+1,right); quickSortInternal(array, left, pivotIndex - 1);//注意区间范围 quickSortInternal(array, pivotIndex + 1, right); } private static int partion1 ( int[] array, int left, int right){ int pivot = array[right]; int less = left; int great = right; while (less < great) { while (less < great && array[less] <= pivot) { less++; } while (less < great && array[great] >= pivot) { great--; } swap(array, less, great); } swap(array, less, right); return less; }
第二种:挖坑法
找到基准元素pivot,设两个变量less和great,less从第一个数开始向后遍历,直到找到大于pivot的数,停下,将array[less]的值放到array[great]处。(即array[great]=array[less])
而后让right从当前区间最后一个数开始往前遍历,直到找到小于pivot的数,停下,进行array[less]=array[great]的操做。再接着less++向后遍历,重复以上操做,结束条件为left>=right;
结束后将pivot的值赋给当前less(great)的数组元素
图示:
注意:pivot基准元素能够任意选,但这里为了讲述方便,每次选择区间的最后一个元素
最终结果 less
private static int partion1 ( int[] array, int left, int right){ int pivot = array[right];//基准值 int less = left; int great = right; while (less < great) { while (less < great && array[less] <= pivot) { less++; } array[great] = array[less]; while (less < great && array[great] >= pivot) { great--; } array[less] = array[great]; } array[less] = pivot; return less; }