一、原理
1. 从待排序区间选择一个数,作为基准值(index);
2. Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;
3. 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间的长度 == 0,代表没有数据。
二、图解
1.以{1, 3, 6, 5, 0, 2}为例,将较小的数换在左边,反之在右边。
将最右边的数作为基准值,right先从右边向左找第一个比基准值2小的数,找到为0;left再从左边向右找第一个比基准值大的数,找到为3,交换这两个数。
2.
在1.的基础上,right先走,从右往左找第一个比基准值2小的数,我们发现,此时right和left相遇了,将相遇的值与基准值2比较,相遇的值比基准值大,所以我们交换两个数。
3.
现在,第一趟比较已经结束,数字2相当于已经归位了,所以我们以2为分界线,分别比较2左边的数和2右边的数,比较方法和上面的一样。最后我们会得到一组有序的数。
三、代码实现
public static void quickSort(int[] array) { //快速排序
quickSortHelper(array, 0, array.length - 1);
}
private static void quickSortHelper(int[] array, int left, int right) {
if (left >= right) {
return;
}
int index = partition(array, left, right);
quickSortHelper(array,left, index - 1);
quickSortHelper(array, index + 1,right);
}
private static int partition(int[] array, int left, int right) {
int index = right; //基准值
while (left < right) {
while (left < right && array[left] <= array[index]) {
left++;
}
while (left < right && array[right] >= array[index]) {
right--;
}
swap(array, left, right);
}
swap(array, left, index);
return left;
}
public static void swap (int[] array, int x, int y) {
int tmp = array[x];
array[x] = array[y];
array[y] = tmp;
}