手撕Java快排
思想
从乱序的数字中找一个中位数(便于理解,就取最后一个数),设想两个游标,左游标指向第0个数,右游标指向最后一个数
第一步:左游标右移,直到找到一个数比中位数大的停止
第二步:右游标左移,直到找到一个数比中位数小的停止
第三步:交换左右游标的指向的数,这时候发生一个现象就是小的数在左移,大的数在右移
第四步:重复一二三步,直到左右游标指向同一个数。这时候交换中位数和同时指向的数。这时候发生一个现象就是左右游标同时指向的位置,左边全是比该位置对应的数小的数,右边全是比该位置对应的数大的数
第五步:以左右游标同时指向的位置分区,左区做一二三四重复操作,右区也做一二三四重复操作(说白了就是递归了)
实现
import java.util.Arrays;
/**
* 快排
*
* @author zab
* @date 2021-01-25 23:31
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = {1, 2, 5, 9, 4, 6, 7, 3, 8};
quickSort(a, 0, a.length - 1);
}
private static void quickSort(int[] a, int start, int end) {
if (a.length < 1) {
return;
}
if (start >= end) {
return;
}
int left = start;
int right = end;
int pivot = a[end];
while (left < right) {
//不断与左边比较,直到左边出现一个比pivot大的数停止
while (left < right && a[left] <= pivot) {
left++;
}
//不断与右边比较,直到右边出现一个比pivot小的数停止
while (left < right && a[right] >= pivot) {
right--;
}
//停止,交换左右下标数,保证左边都比pivot小,右边都比pivot大
swap(a, left, right);
}
//遇到left 下标和right 下标重合了,交换重合点和pivot
swap(a, left, end);
System.out.println(Arrays.toString(a));
//分区,左区都比pivot小,右区都比pivot大,递归调用
quickSort(a, start, left - 1);
quickSort(a, left + 1, end);
}
private static void swap(int[] a, int left, int right) {
int temp = a[left];
a[left] = a[right];
a[right] = temp;
}
}