数据结构-快速排序

快速排序

实现过程:

  1. 设计函数,参数为数组和需要排序的区间(left和right索引)
  2. 设置左右指针等于左右索引,用于在排序的时候进行依次比较
  3. 选择当前排序区间的第一个数作为基准数pivot
    • 之后的比较都以这个基准数为依据,小于基准数的放左边,大于基准数的放右边
  4. 在左指针小于右指针的情况下,进行循环判断
    • 先判断右指针指向的数是否大于基准数,如果大于的话就不用动,让右指针左移;如果小于的话就把右指针指向的数塞给左指针指向的位置。(第一次的时候左指针指向的是基准数的位置,这个基准数已经被取出了,所以直接覆盖就可以了)
    • 判断左指针指向的数是否小于基准数,如果小于的话就不用动,让左指针右移;如果大于的话就把左指针指向的数塞给右指针指向的位置
  5. 循环结束的时候
    • 左右指针会相遇,此时中间位置可以理解为是空缺的,这时候将基准数放入即可
  6. 进行递归前的判断
    • 如果左指针小于right索引的话,表示当前排好序的区间的右边还有数据没排,此时可以将左指针右移一位作为递归的left索引,将数组和right索引重新传进方法进行递归
    • 如果右指针大于left索引的话,表示当前排好序的区间的左边还有数据没排,此时可以将右指针左移一位作为递归的right索引,将数组和left索引重新传进方法进行递归
import java.util.Arrays;

/**
 * @author 小火娃
 * @project_name: my_project
 * @package_name: com.xiaohuowa.arraysort
 * 快速排序:
 *     每次选择一个基准数,剩余比基准数小的都放左边,大于等于基准数的放右边
 *     下一次将左右两块再进行分别快速排序
 */
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) {
            // 如果r指针指向的数不小于基准数的话就向左移动r指针
            while (arr[r] >= pivot && l < r){
                r--;
            }
            if (l < r){
                arr[l] = arr[r];
            }
            // 如果l指针指向的数比基准数小的话就向右移动l指针
            while (arr[l] < pivot && l < r){
                l++;
            }
            if (l < r){
                arr[r] = arr[l];
            }
        }
        // 到这里的时候两个指针相遇,给这个空位赋值pivot,这一轮排序结束
        arr[r] = pivot;

        // 递归进行其他部分的排序
        if (l < right) {
            toSort(l + 1, arr, right);
        }
        if (r > left) {
            toSort(left, arr, r - 1);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值