学习笔记-快速排序

news/2024/5/19 23:07:34 标签: 算法, java, 快速排序

快速排序

将一个一维数组从小到大排列。

思路

在这里插入图片描述
快速排序利用了递归的思想。需要三个参数,数组本身,数组起始索引也就是0,数组最右索引,也就是数组长度-1。
简单来说,快速排序的思想是这样的,先选择一个数作为基准数,把比它小的都移动到左边,把比它大的都移动到右边,然后针对左边这个子数组,再选择一个基准数,比它小的移到左边,比它大的移到右边,重复以上,直到子数组只剩1个数,这时候认为是有序的,返回到第一次,对右边子数组做同样的操作。
具体来说。用left记录数组最左边的索引,用right记录数组最右边的索引(同样也指子数组最左和最右,第一次的时候就是0和长度-1)。基准数每次都选最左边的数,也就是arr[left]。接着交错进行大小判断,因为基准数选的最左,所以要从最右开始判断,如果最右的数(arr[right])大于等于基准数(合适,加上等于的情况防止死循环,比如左右基准三数相等,就会左右反复交换死循环),就直接把索引right- -;如果最右的数小于基准数(不合适),就把他移到左边空位也就是arr[left](基准数保留,所以这个位置相当于空了;紧接着判断最左(arr[left]),如果最左的数小于等于基准数(合适),就直接把索引left++;如果最左的数大于基准数(不合适),就把他移到右边空位也就是arr[right](此时原来的arr[right]被移到到了左边所以这个位置就空出来了)。这样下去,当left==right时,两边就判断完了,此时把基准数放到中间(也就是left或者right,此时这里是空位)。接下来,进行左子数组,也就是开始递归调用自己,传入的数组起始索引还是0,但数组最右索引变成了right-1(因为此时基准数在right=left处,那左子数组最右就是right-1),然后开始右子数组,同理数组最右索引还是数组长度-1,数组起始索引就变成left+1。而循环退出的条件就是数组或子数组的长度为1,也就是传入的数组起始索引大于等于数组最右索引(俩索引相等时肯定只有一个数,大于是因为left+1,right-1这种操作可能会使left大于right,比如排完后基准数在最左,三个数都等于0,加减后,left就大于right了)

b站视频讲的很清楚,可以看这个

代码

java"> /**
     * 采用递归的思想
     * @param arr 数组和数组的左右子数组
     * @param L 数组的最左边和左右子数组的最左边
     * @param R 数组的最右边和左右子数组的最右边
     */
    private static void quickSort(int[] arr,int L,int R){
        //也就是子数组只剩一个值了,这时候就认为是有序的
        if(L>=R){
            return;
        }
        int left=L;
        int right=R;
        int pivot=arr[left];//基准数
        //因为right,left随时在变,所以每次操作都要判断大小
        while (left<right){
            while (left<right && arr[right]>=pivot){
                right--;
            }
            if(left<right && arr[right]<pivot){
                arr[left]=arr[right];
            }
            while (left<right && arr[left]<=pivot){
                left++;
            }
            if(left<right && arr[left]>pivot){
                arr[right]=arr[left];
            }
        }
        //左右排完后把基准数放中间
        if(left==right){
            arr[left]=pivot;
        }
        //排左边
        quickSort(arr,L,right-1);
        //排右边
        quickSort(arr,left+1,R);
    }

http://www.niftyadmin.cn/n/1711667.html

相关文章

学习笔记-归并排序

归并排序 将一个一维数组从小到大排序。归并排序采用了一种化繁为简、分而治之的思想。总的来说&#xff0c;是把一个数组先不断拆分&#xff0c;直到拆分到一个一个单独的元素&#xff0c;再把他们逐渐合并起来。这里边用到了递归回溯。 合并思路 先说合并的思路&#xff1…

学习笔记-基数排序

基数排序 将一个一维数组从大到小排列。基数排序是桶排序的扩展。它是一种稳定的排序方法&#xff0c;也就是说&#xff0c;排序之前相同大小的数字的位置次序在排序后并没有发生改变。同时&#xff0c;基数排序是一种用空间换时间的排序方法&#xff0c;当数据量过大时&#…

vnpy本地数据导入

前置准备&#xff1a; &#xff08;附加说明&#xff0c;系统用的win10&#xff09; 1. 下载vnpy exe软件&#xff0c;目前(2021-10)最新已经到2.7.0版本&#xff0c;直接在vnpy官网上下载&#xff0c;下载后安装&#xff0c;要记得安装目录【安装完需要几分钟】 2. 到githu…

【web前端期末大作业】制作一个HTML+CSS保护动物宠物网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

PyQt5项目使用pyinstaller打包

我理解的一般性的一个完整项目会包含代码、资源文件、本地数据库&#xff0c;我的目标是打包成一个exe文件&#xff0c;最终结果尽可能简洁。为达到这样一个目的&#xff0c;需要以下几个步骤&#xff1a; 1. 项目中引用资源、调用本地数据库的路径的设置要有技巧 1.1 将资源…

学习笔记-二分法查找

二分法查找 要求必须是一个有序数组&#xff0c;才可以进行二分法查找。二分法运用到了递归回溯的思想。 思路 1.确定中间数的坐标 mid&#xff08;leftright&#xff09;/2 2.如果中间数大于查询的数&#xff0c;说明查询的数在左边&#xff0c;向左递归继续查询&#xff0…

PyQt5绘图pyqtgraph多条折线图

最终效果图 代码(可直接复制到一个.py文件运行&#xff0c;运行后的效果如上图) from PyQt5 import QtWidgets import pyqtgraph as pg from typing import Any,Dict import random,sysclass RotateAxisItem(pg.AxisItem):def drawPicture(self, p, axisSpec, tickSpecs, text…

学习笔记-哈希表(散列)

哈希表&#xff08;散列&#xff09; 解决一个问题&#xff1a; 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的 id 时,要求查找到该员工的所有信息. 要求: 不使用数据库,尽量节省内存,速度越快越好>哈希表(散列&#xff09…