快速排序算法 (c/c++)

2023-11-11

QuickSort:

  • 通过一趟排序将要排序的数据分隔成独立的两部分,其中一部分的所有数据都要比另一部分数据小,然后按此方法对这两部分分别再进行快速排序,整个排序过程可以递归进行,以此达到数据的有序。
        ㅤㅤㅤㅤㅤㅤ
  • 快速排序算法通过多次比较和交换实现排序,流程如下
    首先设定一个分界值,将数据分成左右两部分
    将大于等于分界值的数据集中到数组右边,将小于等于分界值的数据集中到数组左边,
    然后左边和右边分别再各自取分界值进行类似处理
    重复上述操作,通过递归将左边排好序后,再递归右边,当左右两个部分各个数据排序完成后,整个数据的排序也就完成。

Code_1(中间元素为基准)

void QuickSort(int *arr ,int end,int start,int length){   //初始start = 0 end = length-1 
	//传入length值是为了方便打印每趟排序序列
    int i = start; // i=0 数据第一个元素
    int j = end;   // j=length-1 数据最后一个元素
    int mid = arr[(start+end)/2];  //中间位置值为基准
    do{
        while(arr[i]<mid)	//循环找到前序列大于基准的值
            ++i;
        while(arr[j]>mid)	//循环找到后序列小于基准的值
            --j;
        if(i<=j){
            swap(arr[i],arr[j]);	//交换两值
            ++i;
            --j;
        }
    }while(i<=j);
    
    //打印每趟排序结果
    cout<<"每趟排序序列:";
    for(int k = 0;k<length;k++)
        cout<<setw(2)<<setfill('0')<<arr[k]<<" ";
    cout<<endl<<"-----------------------"<<endl;
    
    if(i<end)
        QuickSort(arr,end,i,length);	//后序列递归
    if(start<j)
        QuickSort(arr,j,start,length);	//前序列递归
}

Code_1示例结果

Before Sort:  01 05 06 03 04 02 07
-----------------------
-----------------------
每趟排序序列:01 02 03 06 04 05 07
-----------------------
每趟排序序列:01 02 03 04 06 05 07
-----------------------
每趟排序序列:01 02 03 04 05 06 07
-----------------------
每趟排序序列:01 02 03 04 05 06 07
-----------------------
每趟排序序列:01 02 03 04 05 06 07
-----------------------
-----------------------
After  Sort:  01 02 03 04 05 06 07

Code_2(第一元素为基准)

分治策略

  • 分解arr[s…t]为arr[s…i-1]和arr[i+1…t]其中i为划分基准
  • 求解子问题:若子序列长度为0或1,则他是有序的,直接返回,否则递归求解各个子问题
  • 合并:由于整个序列存放在数组arr中,排序过程就地进行,合并步骤不需要任何操作

在这里插入图片描述

int Partition(int *arr,int s,int t){    //划分算法
    int i = s,j = t;
    int tmp = arr[s];   //用第一元素作为基准
    while(i!=j){    //从序列两端交替向中间扫描,直到i = j为止
        while(j>i&&arr[j]>=tmp)
            --j;    //从右向左扫描,找到第1个关键字小于tmp的arr[j]
        arr[i] = arr[j];    //将arr[j]前移到arr[i]的位置
        while(i<j&&arr[i]<tmp)
            ++i;    //从左向右扫描,找到第1个关键字大于tmp的arr[i]
        arr[j] = arr[i];    //将arr[i]后移到arr[j]的位置
    }
    arr[i] = tmp;   //放入基准值
    return i;   //返回基准值所在数组下标
}

void QuickSort(int* arr ,int s,int t,int length){	//传入length是为了打印每趟序列
    //对arr[s..t]进行递增排序
    if(s<t){    //序列至少存在2个元素
        int i = Partition(arr,s,t);

        //打印每趟排序结果
        cout<<"每趟排序序列:";
        for(int k = 0;k<length;k++)
            cout<<setw(2)<<setfill('0')<<arr[k]<<" ";
        cout<<endl<<"-----------------------"<<endl;

        QuickSort(arr,s,i-1,length);   //对左子序列递归排序
        QuickSort(arr,i+1,t,length);   //对左子序列递归排序
    }
}

Code_2示例结果

Before Sort:  02 05 01 07 10 06 09 04 03 08
-----------------------
-----------------------
每趟排序序列:01 02 05 07 10 06 09 04 03 08
-----------------------
每趟排序序列:01 02 03 04 05 06 09 10 07 08
-----------------------
每趟排序序列:01 02 03 04 05 06 09 10 07 08
-----------------------
每趟排序序列:01 02 03 04 05 06 09 10 07 08
-----------------------
每趟排序序列:01 02 03 04 05 06 08 07 09 10
-----------------------
每趟排序序列:01 02 03 04 05 06 07 08 09 10
-----------------------
-----------------------
After  Sort:  01 02 03 04 05 06 07 08 09 10

算法分析

  • 时间复杂度:
    最好O(n2)
    最坏O(nlogn)
    平均O(nlogn)
  • 空间复杂度:O(logn)
  • 排序方式:内部排序
  • 稳定性:不稳定
  • ——————END-2022-01-05——————
  • 个人学习笔记,如有纰漏,敬请指正。
  • 感谢您的阅读。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序算法 (c/c++) 的相关文章

  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 强制 const 存储返回的值 value

    这就是我想要实现的目标 struct test const test returnconst return test test returnnonconst return test int main test t1 returnnoncon
  • 如何在自定义保存操作 WFFM 中获取 Sitecore.Current.Site 对象?

    我在用着面向营销人员的 Sitecore 网络表单 在里面save action我得到的表格Sitecore Context Site对象 但该对象没有返回正确的上下文 该值为 modules shell 有谁知道我如何才能获得正确的上下文
  • 在 IEnumerable 中查找相同的集合

    有一项任务要弄清楚如何更新表 DataTable 连接到一个database没有UPDATE陈述 我想出的例子是从邮箱中读取警报 该表将写入 Alerts 如果邮件正文包含单词 SUCCESS gt Alert 变为绿色 如果 FAIL g
  • 有了private修饰符,为什么可以直接访问其他对象中的成员呢?

    我有以下代码 class A private int x public A x 90 A A a1 A a2 a1 x 10 a2 x 20 int getX return this gt x 我知道代码可能很奇怪 但我不明白为什么a1 a
  • C# 委托实例化与仅传递方法引用 [重复]

    这个问题在这里已经有答案了 我有一个简单的问题 与仅传递函数引用相比 实例化 C 委托有什么优势 我的意思是 Why do Thread t new Thread new ThreadStart SomeObject SomeMethod
  • 终止以 System.Diagnostic.Process.Start("FileName") 启动的进程

    我正在尝试创建一个将在特定时间执行操作的应用程序 很像 Windows 任务计划程序 我当前正在使用 Process Start 来启动任务所需的文件 或 exe 我通过调用文件 mp3 启动一个进程 该进程启动 WMP 因为它是默认应用程
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 在 .NET Core 上通过 MEF 将参数传递给插件构造函数?

    我花了几个小时试图弄清楚如何通过 MEF System Composition 将参数传递给插件构造函数 但一切都无济于事 不用说 相关文档很少 查看源代码也没有帮助 这曾经非常容易做到 使用 CompositionHost Compose
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 警告从 lambda 返回捕获的引用

    我尝试使用 lambda 有条件地将引用绑定到两个变量之一 int foo bar int choice gt int if true some condition return foo else return bar 这会在 clang
  • In 和 Out 属性在 .NET 中如何工作?

    我一直在尝试跨序列化数组AppDomain边界 使用以下代码 public int Read byte buffer int offset int count return base Read buffer offset count 作为猜
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne
  • 如何获取打印机设备上下文?

    我在 Windows 上尝试使用以下命令打印增强型图元文件 EMF 播放增强元文件 http msdn microsoft com en us library dd162800 28VS 85 29 aspx 我当前正在使用屏幕上窗口的设备
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 动画设计基础(第一节)-3d max2014 自制小球下落轨迹(气球-铁球-弹球-篮球-乒乓球)

    动画设计基础 第一节 3d max2014 自制小球下落轨迹 气球 铁球 弹球 篮球 乒乓球 各种球运动轨迹比较视频 各种自制小球下落 气球 铁球
  • eruda/vconsole 手机端调试利器

    0 对比 edura 相比 vconsole 可以看css样式 1 edura 1 1 function var script document createElement script script src cdn jsdelivr ne
  • 判断OBject对象为空(包括null ,““)的方法

    这篇文章主要介绍了Java判断对象是否为空 包括null 的方法 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 目录标题 对象之间判断需要了解的 代码示例 问题原因 注
  • Python爬虫从入门到精通:(25)scrapy框架02_scrapy框架的基本使用_Python涛哥

    scrapy的基本使用 创建一个工程 命令 scrapy startproject ProName 比如这里我创建一个工程 名字叫demoPro 打开终端 输入 scrapy startprojiect demoPro 目录结构 这里先介绍
  • 等保2.0.2021版综合测评得分计算实例

    文章目录 公式回顾 单个测评对象的计算 多个测评对象的计算 小结 未经许可 严禁转载 公式输入请参考 在线Latex公式 接上篇的 等保2 0 2021版等级测评报告模板修订总结 这次根据一个实际案例来看看2021版综合测评得分如何计算 2
  • 搭建学校oj平台-后端设置JWT与用户操作

    后端设置JWT与用户操作 gitee仓库代码在文章尾部 Mysql新建user表 create table user id int auto increment username varchar 100 null password varc
  • 【unity3D】TimeLine(详细图解)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇关于unity的TimeLine TimeLine 介绍 打开TimeLine面板的方式 创建TimeLine 创建Track的两种方式 Track的详解 Ti
  • win10使用技巧02--系统端口被占用怎么查看

    1 打开命令提示符 管理员模式 2 输入netstat ano命令 回车后 能看到所有端口的情况 3 如果我们知道具体的端口号的话 输入netstat aon findstr 8080 其中8080加英文双引号 按回车键就可以找到占用808
  • Spark环境搭建(保姆级教程)

    文章目录 一 环境准备 二 Spark环境搭建 1 Spark部署方式 2 安装spark 1 下载Spark 关于版本的选择 2 安装Spark 上传安装包 解压并创建软链接 Spark的目录结构 配置环境变量 配置Hadoop信息 修改
  • 飞行姿态解算(三)

    继之前研究了一些飞行姿态理论方面的问题后 又找到了之前很流行的一段外国大神写的代码 来分析分析 第二篇文章的最后 讲到了文章中的算法在实际使用中有重大缺陷 大家都知道 分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况 原因是很多情
  • CSS响应式设计——(视口/网格视图/媒体查询/图像/视频)看这一篇就够了

    目录 响应式网页设计 简介 什么是响应式网页设计 为所有用户获得最佳体验的设计 响应式网页设计 视口 什么是视口 设置视口 把内容调整到视口的大小 响应式网页设计 网格视图 什么是网格视图 构建响应式网格视图 实例 CSS CSS HTML
  • windows 使用 wget——Wget for windows

    wget是一个强力方便的命令行下的下载工具 windows 如果使用需要安装 Wget for windows 地址 Link 下载压缩包 ZIP 解压到一个常用的安装位置 然后按照下面的步骤 配置环境变量 系统属性 此电脑右击选择属性 左
  • Vim安装配置和常用技巧

    第一章 安装 在命令行运行vim 如果找不到程序 需要自己安装 1 1 下载 从官方网站ftp ftp vim org pub vim unix 中选择一个版本下载 我这里使用的是vim 7 3 tar bz2 1 2 解压程序 tar x
  • 如何用js动态添加css

    转自 微点阅读 https www weidianyuedu com 为了节省代码和写出更兼容的代码 有时我们需要用Javascript动态的增加CSS样式 IE下 我们可以使用 document createStyleSheet 方法 而
  • C/C++实现strstr函数、KMP算法查找子串

    C C 实现strstr KMP算法查找子串 目录 C C 实现strstr KMP算法查找子串 1 字符串形式 2 字节流形式 1 字符串形式 代码实现 char my strstr const char src const char d
  • 反射改进简单工厂(含代码)

    一 简单工厂代码 父类Car public class Car public void CreateCar 子类ElectricityCar public class ElectricityCar extends Car Override
  • 使用mysql数据库与go进行交互

    database sql database sql是golang的标准库之一 它提供了一系列接口方法 用于访问关系数据库 它并不会提供数据库特有的方法 那些特有的方法交给数据库驱动去实现 database sql库提供了一些type 这些类
  • 线性代数(2)——矩阵

  • [完]机器学习实战 第十四章 利用SVD简化数据

    本章内容 SVD矩阵分解 推荐引擎 利用SVD提升推荐引擎的性能 餐馆可分为很多类别 不同的专家对其分类可能有不同依据 实际中 我们可以忘掉专家 从数据着手 可对记录用户关于餐馆观点的数据进行处理 并从中提取出其背后的因素 这些因素可能会与
  • 快速排序算法 (c/c++)

    快速排序 QuickSort Code 1 中间元素为基准 Code 1示例结果 Code 2 第一元素为基准 Code 2示例结果 算法分析 QuickSort 通过一趟排序将要排序的数据分隔成独立的两部分 其中一部分的所有数据都要比另一