码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构 ----- 快速排序


    ​
    ​​
    ​​

    ​ 快速排序

    活动地址:CSDN21天学习挑战赛

    目录

        • 一、快速排序
          • 1.1 概念
          • 1.2 查找过程
          • 1.3 代码演示
            • 1.3.1
            • 1.3.2
            • 1.3.3
            • 1.3.4
            • 1.3.5
          • 1.4 代码测试
          • 1.5 代码分享

    一、快速排序

    1.1 概念

    快速排序是由冒泡排序改进而来的,虽然是由冒泡排序改进而来,但是在排序思想上其实并没有什么必然的联系,只是同属交换排序;
    快速排序的排序思想是通过基准值分区,然后将一个大排序分割成一个个小排序,然后再分直至出现一个有序序列;

    1.2 查找过程

    • 快速排序的排序思路第一件事就是取一个基准值进行比较,我们在这边把每一次排序的第一个元素作为对比的基准值;
    • 由下图我们可以看到,在第一轮排序中我们取 9 作为基准值,然后用剩余所有元素跟其进行对比,如果比 9 要小,就将该元素放置在 9 的左方,如果比 9 要大,就将该元素放置在 9 的右边;
    • 进行完一轮排序后,我们所使用的基准值已经到达了其最终所在的位置,所以这个值已经不需要参与排序了;
    • 根据前一轮所选取的基准值,我们在其左边再进行一次排序,右边也同理再进行一次排序;
    • 根据上述规则不断分区,直到整个序列有序之后整个排序就结束了;

    在这里插入图片描述

    图 1.1

    1.3 代码演示

    1.3.1
    • 将需要排序的序列存入数组;
    • 建立一个方法,将数组传入、起始坐标传入、终点坐标传入;

    在这里插入图片描述

    图 1.2
    1.3.2
    • 将基准值传进一个辅助空间;
    • 将起始坐标和终点坐标拷贝一份用于遍历;

    在这里插入图片描述

    图 1.3
    1.3.3
    • 根据基准值进行第一次排序;
    • 从右边的点位点开始向前遍历,直到查找到一个小于基准值的元素,并将该值赋值至左边的定位点;(因为最左边元素是作为基准值的,已经拷贝在辅助变量内,所以可以直接替换掉)
    • 右边遍历完后再从左边的定位点进行向后遍历,直到查找到一个大于基准值的元素,并将该元素赋值至右边的定位点;
    • 直到左边定位坐标最终不小于右边定位坐标时,一次循环结束,然后将基准值传入两个坐标相交的位置;( 跳出循环的最终条件就是左边定位坐标等于右边定位坐标 )

    在这里插入图片描述

    图 1.4
    1.3.4
    • 加入两个递归对左右两个区间进行同样的方式排序;

    在这里插入图片描述

    图 1.5
    1.3.5
    • 当起始定位坐标不小于终点定位坐标时,就代表无法进行排序了,直接返回;

    在这里插入图片描述

    图 1.5

    1.4 代码测试

    1. 在每一轮排序结束后添加一个遍历输出序列;
    2. 通过每一轮的序列我们可以看出整个排序的过程;
    3. 结论:代码可用无误;

    在这里插入图片描述

    图 1.5

    1.5 代码分享

    public class test {
    
        public static void main(String[] args) {
            int[] arr = {   15 ,20 , 14 ,   21  ,12 , 9 , 16 , 18 , 10 };
            celerity(arr,0,arr.length-1);
    
            System.out.println("最终产生的有序序列为:");
            for ( int e: arr ) {
                System.out.print( e + " ");
            }
    
        }
    
        private static void celerity(int[] arr,int left,int right) {
            if ( left >= right )
                return;
            int temp = arr[left];
            int i = left,j = right;
    
            while ( i < j ){
                while ( temp <= arr[j] && j > i )
                    j--;
                arr[i] = arr[j];
                while ( temp >= arr[i] && j > i )
                    i++;
                arr[j] = arr[i];
            }
            arr[i] = temp;
            celerity(arr,left,i-1);
            celerity(arr,i+1,right);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    Java循环结构—多重循环及continue break(基础)
    监测难?误差大?北斗突破铁路监测预警难题,24小时全方位守护
    AppData文件夹下Local,Locallow和Roaming
    postman一些你不常用的实用技巧,竟然还能这么玩
    Redis 的内存策略
    深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)
    CEC2023:基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023(提供MATLAB代码及参考文献)
    C++报错illegal instruction
    Leetcode 151:反转字符串中的单词
    【光谱特征选择】连续投影算法SPA(含python代码)
  • 原文地址:https://blog.csdn.net/jc15274630894/article/details/126192209
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号