快速排序是一种相对比较快的排序,它的思想为:
选取待排序元素序列中的一个元素作为基准值,然后(以升序为例)比基准值小的元素放在基准值左边,比基准值大的元素放在基准值右边,这样的话,原先待排序序列就被分为了左子序列,右子序列,基准值,三个部分,,然后把左子序列看做新的待排序序列进行上述操作,左子序列又被分为新的左右子序列(递归的思想),当左子序列处理完之后再去处理右子序列,最后着呢个待排序序列就有序了。
下面是动图演示过程:
public static void quickSort(int[] array){
//把基准值选在待排序序列的最左边,第一次就是 0 的位置。
quickSortRange(array, 0, array.length - 1);
}
private static void quickSortRange(int[] array, int from, int to) {
int size = to - from + 1;
//递归结束条件
if (size <= 1)
return;
//先处理传入序列,返回值为一次单趟排序之后的基准值的位置,
//基准值左边为左子序列,基准值右边为右子序列
int index = partition(array, from, to);
//处理左子序列
partition(array, from, index - 1);
//处理右子序列
partition(array, index + 1, to);
}
/*这是一次单趟排序:
1、选出一个key,一般是最左边或是最右边的。
2、定义一个L和一个R,L从左向右走,R从右向左走。
(需要注意的是:若选择最左边的数据作为key,则需要R先走;若选择最右边的数据作为key,则需要L先走)。
3、在走的过程中,若R遇到小于key的数,则停下,L开始走,
直到L遇到一个大于key的数时,将L和R的内容交换,R再次开始走,如此进行下去,
直到L和R最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)
经过一次单趟排序,最终使得key左边的数据全部都小于key,key右边的数据全部都大于key。
*/
private static int partition(int[] array, int from, int to) {
int left = from;
int right = to;
int key = array[from];
while (left < right){
while (array[right] >= key && right > left)
right--;
while (array[left] <= key && right > left)
left++;
swap(array, left, right);
}
//走到这里说明 left == right了,
//让基准值到中间,方便后续处理左子序列
swap(array, from, left);
return left;
}