案例:
假如待排序列如下:
6
为基准数,然后先从右边开始遍历,找到一个比基准数小的数,如下图:5
和7
的位置,结果如下:7
的位置开始,找到比基准数小的数,如下:5
开始找,结果如下:9
和4
的位置,结果如下:3
,然后从左边找比基准数大的,左边指针移动到3的时候,左右指针重合了,如下:6
和3
的位置,如图:6
左边的都是比它小的,右边的都是比它大的。左边部分和右边部分看成是两个新的待排序列,两个序列都按照上述方式再进行排序,先排左边,再排右边。结合上面的案例,以及代码中的注释,可以说是思路十分清晰了,完整代码如下:
public static void sort(int[] arr, int left, int right) {
if (arr == null || arr.length == 1) {
return;
}
if (left > right) {
return;
}
int base = arr[left]; // 最左边的数当作基准数
int i = left; // 从左往右遍历的指针
int j = right; // 从右往左遍历的指针
int temp = 0; // 用来保存临时变量
// 当左右指针不相遇的时候,就进行检索
while(i != j) {
// 先从右往左检索,直到检索到比基准数小的
while (arr[j] >= base && i < j) {
j--;
}
// 再从左往右检索,直到检索到比基准数大的
while (arr[i] <= base && i < j) {
i++;
}
// 跳出了上面两个while循环,表示右边找到了基准数小的,左边找到了比基准数大的,交换位置
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 跳出了最外层while循环,表示i和j相等,左右指针相遇了,交换基准数和此时指针指的元素
arr[left] = arr[i];
arr[i] = base;
// 此时,第一趟排序完成,左边和右边看成新数组,重复上述步骤
sort(arr, j+1, right); // 排右边
sort(arr, left, i-1); // 排左边
}
快速排序之所以成为快速排序,那就是因为它快,经测试,排1千万数据大概是1秒的样子,还真是有两把刷子。
联系客服