【分治法】快速排序

简介: 【分治法】快速排序

 一、快速排序:

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

    • 1.先从数列中取出一个数作为基准数。(第一个数)
    • 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
    • 3.再对左右区间重复第二步,直到各区间只有一个数。  

    二、思路分析:

    1、两个主要功能函数:int find(int *b,int left,int right)与 void quicksort(int *b,int left,int right)

    2、find()功能:将传入的区间首值放至正确位置(其左边值皆小于其,其右边值皆大于其)

    3、quicksort()函数功能:调用find将该区间首值放至正确位置,再对已放至正确位置的左边区间与右边区间快排。

    4、find()函数详解:flag表示的从left+1位置至flag位置存的数据皆小于b[left]。

          (1)、 i是循环遍历的,但flag只会因if(b[i]<num)才执行+1,所以随着i的移动,flag可能没有移动。

          (2)、若出现了b[i]<num的情况,且i与flag不相等(说明中间有大于等于num的值,导致flag没有移动),就需要把这个小于num的b[i],与大于等于num的b[flag+1]交换位置。来保证实现“ 从left+1位置至flag位置存的数据皆小于b[left]。”

    三、代码如下:

    //快速排序分治法 
    #include <iostream>
    using namespace std;
    #define N 1000
    int n=5;
    int a[N];
    int find(int *b,int left,int right){//将首位数放至正确位置:其左边值皆小于它,右边值皆大于它 
      if(left<right){
        int flag=left; 
        int num=b[left];
        for(int i=left+1;i<=right;i++){//从left+1位置开始比较 
          if(b[i]<num){
            flag++;//移动flag,自left+1至flag(+1操作后的)的值皆小于b[left] 
            if(flag!=i){//交换b[i]与b[flag]
              int change=b[flag];
              b[flag]=b[i];
              b[i]=change;
            }
          }
        }
        //上述循环执行完毕,flag为此段首值在此段的正确位置(flag左边值皆小于其,flag右边值皆大于其)  
        int change=b[flag];
        b[flag]=b[left];
        b[left]=change; 
        return flag;
      }
    }
    void quicksort(int *b,int left,int right){//快排且分治 
      if(left<right){
        int x=find(b,left,right);
        quicksort(b,left,x-1);//对已放至正确位置的x值左边快排 
        quicksort(b,x+1,right);//对已放至正确位置的x值右边快排 
      } 
    }
    void print(){//打印结果 
      for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
      }
    }
    int main(){
      for(int i=1;i<=n;i++){
        cin>>a[i];
      }
      //cout<<find(a,1,5)<<endl;
      quicksort(a,1,5);
      print();
      return 0;
    }

    image.gif

    四、示例输入输出:

    1、输入

    522 2401 123 100 2
    image.gif

    2、输出

    2 100 123 522 2401
    image.gif


    目录
    相关文章
    |
    存储 Oracle 关系型数据库
    Oracle的存储结构
    Oracle的存储结构
    254 1
    |
    缓存 安全 Java
    Spring Get请求 与post请求
    本文详细介绍了Spring框架中GET请求和POST请求的区别及应用场景。GET请求用于从服务器获取资源,参数附在URL末尾,适合查看非敏感信息;POST请求用于向服务器提交数据,参数在请求体中传输,适合处理敏感信息。Spring通过`@GetMapping`和`@PostMapping`注解分别处理这两种请求。此外,文章还提供了示例代码,展示了如何在Spring中实现这两种请求的处理。最后,文章总结了推荐使用POST请求的原因,包括更高的安全性、更大的数据传输量、更好的幂等性及灵活性。
    601 1
    Spring Get请求 与post请求
    |
    前端开发 Java 数据库连接
    MVC模式和三层架构-登录注册增删改查案例-(详细案例)
    MVC模式和三层架构-登录注册增删改查案例-(详细案例)
    MVC模式和三层架构-登录注册增删改查案例-(详细案例)
    |
    设计模式 Java
    Java设计模式-观察者模式(Observer)
    Java设计模式-观察者模式(Observer)
    |
    机器学习/深度学习 Linux 数据安全/隐私保护
    维吉尼亚密码(Vigenere)
    维吉尼亚密码(Vigenere)
    401 0
    |
    3天前
    |
    云安全 人工智能 算法
    以“AI对抗AI”,阿里云验证码进入2.0时代
    三层立体防护,用大模型打赢人机攻防战
    1309 3
    |
    4天前
    |
    机器学习/深度学习 安全 API
    MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
    MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
    643 3
    |
    4天前
    |
    人工智能 Rust 运维
    这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
    加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
    |
    11天前
    |
    编解码 人工智能 自然语言处理
    ⚽阿里云百炼通义万相 2.6 视频生成玩法手册
    通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
    754 5