算法学习之快速排序

原理

分治算法,每次确定一个值的位置,即将一个值在数组中排好顺序,并且分成左右两部分,左边的值都比该值小,右边的值都比该值大

思路

  • 我们默认每次的基准数(即要排序的数)都为数组中的第一个数

  • 先从数组的最右边开始,向左循环找到比基准数小的数

  • 在从数组的左边开始,向右循环找到比基准数大的数

  • 将两数交换位置

  • 重复234步骤直到左右下标相遇

  • 将数组分为左右两部分进行递归

代码

public class QuickSort {
    /**
     * 快速排序: 原理是首先确定一个基准数(本程序采用left为基准数),将数组分为基准数左右两部分,左边比基准数小,右边比基准数大,之后将基准数放到相应的位置,
     *         即每次都确定一个数的位置
     *         再以基准数左右两边作为两个数组进行上述操作(递归),直到right<left为止
     * @param arr
     * @param left 左起始
     * @param right 右起始
     * @return
     */
    public  int[] quickSort(int arr[] , int left , int right){
        if (right < left) {
            return arr;
        }
        int index = arr[left];// 基准数
        int temp = 0;
        int q = left ;
        int p = right ;
        while (p != q) {
            // 先进行右边的移动的原因是,最后基准数的位置要比p小,比q大
            while (p > q && arr[p] >= index) {// 从最右边找到比基准数小的数准备交换
                p--;
            }
            while (p > q && arr[q] <= index) {// 从最左边找到比基准数大的数准备交换
                q++;
            }
            // 交换两个数,保证右边的数都比基准数大,左边的都比基准数小
            temp = arr[p];
            arr[p] = arr[q];
            arr[q] = temp;
        }
        // 基准数定位,注意这里因为是现移动的右边,所以在q==p的时候,是停在较小的数上的
        // 即left~q的数都比index小,q+1~right的数都比index大
        arr[left] = arr[p];
        arr[p] = index;
        // 进入遍历
        quickSort(arr,p+1,right);
        quickSort(arr,left,p-1);
        return arr;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值