基本思想
对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,对左右子序列用相同的方法递归排序,直到序列中所有数据均有序为止。
快速排序,说白了就是给基准数据找其正确索引位置的过程。
思路图解
以 [19,97,09,17,01,08] 为例,以第一个元素19为base,定义左右两个指针 L和 R,分别从两端开始扫描。从右向左找比19小的数,替换L所在位置的元素。再从左往右找比19大的数,然后替换R所在位置的元素。重复此过程直至L和R重合(两个指针指向同一元素),base替换此元素,此时第一轮结束。再递归排序base左右两部分的元素。 首先R从后向前扫描,如果扫描到的值大于基准数据就让R减1,然后继续往前扫描,直到发现有元素比该基准数据的值小(如上图中08<=base),就将R位置的值赋值给L位置 ,结果如下:
然后交替移动L下标:L从前往后扫描,如果扫描到的值小于基准数据就让L加1,然后继续向后扫描,直到发现有元素大于基准数据的值(如上图97>=base),就再将L位置的值赋值给R位置的值,指针移动并且数据交换后的结果如下:
然后交替移动R下标,向前移动,直到扫描到小于基准数的值,如上图继续扫描到 01 <= 19,则就将R位置的值赋值给L位置 ,结果如下: 然后继续交替移动L下标,向后移动,如上图L一直向后扫描,09比基准数小,继续后移,17比基准数小,继续后移,这时候L和R重合,则base替换此元素。 左子序列都比19小,右子序列都比19大 然后对左右子序列重复以上操作即可。
代码实现
public class QuickSort {
public static void main(String[] args) {
int[] array = new int[]{100, 89, 66, 1, -1, 30, 5, 85, -25};
quickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
private static void quickSort(int[] arr, int left, int right) {
if (left < right) {
int pos = partition(arr, left, right);
quickSort(arr, left, pos - 1);
quickSort(arr, pos + 1, right);
}
}
private static int partition(int[] arr, int left, int right) {
int base = arr[left];
while (left < right) {
while (left < right && arr[right] >= base) {
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] <= base) {
left++;
}
arr[right] = arr[left];
}
arr[left] = base;
return left;
}
}
🤯
|