快速排序
实现过程:
- 设计函数,参数为数组和需要排序的区间(left和right索引)
- 设置左右指针等于左右索引,用于在排序的时候进行依次比较
- 选择当前排序区间的第一个数作为基准数pivot
- 之后的比较都以这个基准数为依据,小于基准数的放左边,大于基准数的放右边
- 在左指针小于右指针的情况下,进行循环判断
- 先判断右指针指向的数是否大于基准数,如果大于的话就不用动,让右指针左移;如果小于的话就把右指针指向的数塞给左指针指向的位置。(第一次的时候左指针指向的是基准数的位置,这个基准数已经被取出了,所以直接覆盖就可以了)
- 判断左指针指向的数是否小于基准数,如果小于的话就不用动,让左指针右移;如果大于的话就把左指针指向的数塞给右指针指向的位置
- 循环结束的时候
- 左右指针会相遇,此时中间位置可以理解为是空缺的,这时候将基准数放入即可
- 进行递归前的判断
- 如果左指针小于right索引的话,表示当前排好序的区间的右边还有数据没排,此时可以将左指针右移一位作为递归的left索引,将数组和right索引重新传进方法进行递归
- 如果右指针大于left索引的话,表示当前排好序的区间的左边还有数据没排,此时可以将右指针左移一位作为递归的right索引,将数组和left索引重新传进方法进行递归
import java.util.Arrays;
public class ArrayQuickSort {
public static void main(String[] args) {
int[] arr = new int[]{5, 8, 10, 1, -2, 6, 7, -2, 6, 7, 5, 3, 7, 6, 4, 1, 0, 2, 9, 10, 8};
toSort(0, arr, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void toSort(int left, int[] arr, int right){
int l = left;
int r = right;
int pivot = arr[l];
while (l < r) {
while (arr[r] >= pivot && l < r){
r--;
}
if (l < r){
arr[l] = arr[r];
}
while (arr[l] < pivot && l < r){
l++;
}
if (l < r){
arr[r] = arr[l];
}
}
arr[r] = pivot;
if (l < right) {
toSort(l + 1, arr, right);
}
if (r > left) {
toSort(left, arr, r - 1);
}
}
}