【分治法】快速排序

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

 一、快速排序:

快速排序是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


    目录
    相关文章
    |
    存储 Java
    【Java基础】- RMI原理和使用详解
    【Java基础】- RMI原理和使用详解
    596 0
    |
    Java Docker 微服务
    如何使用Docker和Docker Compose部署微服务
    【2月更文挑战第12天】
    1232 0
    |
    数据采集 存储 监控
    探索数据治理的实践路径:构建高效、合规的数据生态系统
    在当今这个数据驱动的时代,数据已成为企业最宝贵的资产之一,它不仅驱动着业务决策,还塑造着企业的竞争优势。然而,随着数据量的爆炸性增长和来源的多样化,如何有效管理这些数据,确保其质量、安全性及合规性,成为了企业面临的重大挑战。数据治理作为一套指导数据管理和使用的框架,其重要性日益凸显。本文将探讨推动数据治理的实践路径,旨在帮助企业构建高效、合规的数据生态系统。
    ModuleNotFoundError: No module named ‘openai.error‘
    这篇文章讨论了在使用OpenAI库时遇到的`ModuleNotFoundError: No module named ‘openai.error'`错误,并提供了两种解决方案:将OpenAI版本降级到0.28.0或修改代码以去掉对`openai.error`的引用并将异常处理放置到`openai`模块下。
    ModuleNotFoundError: No module named ‘openai.error‘
    |
    存储 算法 数据可视化
    单细胞分析 | Cicero+Signac 寻找顺式共可及网络
    单细胞分析 | Cicero+Signac 寻找顺式共可及网络
    |
    10月前
    |
    机器学习/深度学习 前端开发 算法
    基于STP文件的智能比对系统技术介绍
    基于STP文件的智能比对系统通过集成多项先进技术,实现设计图纸与实物的自动化、高精度比对。系统采用分布式架构,包含前端Web界面、后端处理服务器、图像数据库和深度学习模型模块,支持STP文件解析、3D模型可视化、多视角图片生成及实物照片智能匹配。该系统显著提升机械制造和质量控制领域的效率与准确性,减少人工操作误差,广泛应用于设计验证、质量检测等场景。
    612 3
    |
    存储 算法 安全
    【集合系列】- 初探java集合框架图(一)
    实际开发中,经常用到java的集合框架,比如ArrayList、LinkedList、HashMap、LinkedHashMap,几乎经常接触到,虽然用的多,但是对集合的整体框架,基础知识还是不够系统,今天想和大家一起来梳理一下!
    2085 0
    【集合系列】- 初探java集合框架图(一)
    |
    机器学习/深度学习 人工智能 运维
    智能化运维:提升IT服务效率的新引擎###
    本文深入浅出地探讨了智能化运维(AIOps)如何革新传统IT运维模式,通过大数据、机器学习与自动化技术,实现故障预警、快速定位与处理,从而显著提升IT服务的稳定性和效率。不同于传统运维依赖人工响应,AIOps强调预测性维护与自动化流程,为企业数字化转型提供强有力的支撑。 ###
    |
    Java Apache Windows
    Jmeter和JDK下载安装及环境变量配置详细教程
    Jmeter和JDK下载安装及环境变量配置详细教程,检验是否安装java环境,若无java环境,先下载安装JDK并配置环境变量;再下载安装Jmeter并配置环境变量,Windows系统双击jmeter.bat文件启动Jmeter,或者在cmd中输入:jemter可正常启动jmeter的GUI界面,则jmeter安装及环境变量配置正常。。。
    11716 2
    Jmeter和JDK下载安装及环境变量配置详细教程
    |
    机器学习/深度学习 数据采集 自然语言处理
    深入浅出:用Python实现简单文本分类器
    【8月更文挑战第31天】本文旨在通过简明的Python代码示例,引导读者理解并实现一个简单的文本分类器。从数据预处理到模型训练,再到结果评估,我们将一步步构建起一个基于朴素贝叶斯算法的文本分类系统。无论你是编程新手还是机器学习初学者,这篇文章都将为你打开一扇通往文本分析世界的大门。