C++实现快速排序(源代码)

2023-10-27

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动

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

该方法的基本思想是:

1.先从数列中取出一个数作为基准数

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

  

以一个数组作为示例,取区间第一个数为基准数

0

1

2

3

4

5

6

7

8

9

72

6

57

88

60

42

83

73

48

85

初始时,i = 0;  j =9;   X = a[i] = 72

由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。

从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8];i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3];j--;

 

数组变为:

0

1

2

3

4

5

6

7

8

9

48

6

57

88

60

42

83

73

88

85

 i = 3;   j =7;   X=72

再重复上面的步骤,先从后向前找,再从前向后找

从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;

从i开始向后找,当i=5时,由于i==j退出。

此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。

 

数组变为:

0

1

2

3

4

5

6

7

8

9

48

6

57

42

60

72

83

73

88

85

可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

 

 

对挖坑填数进行总结

1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。

2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。

3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。

4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

代码如下:

#include<iostream>
using namespace std;
void quickSort(int a[],int,int);
int main()
{
	int array[]={34,65,12,43,67,5,78,10,3,70},k;
	int len=sizeof(array)/sizeof(int);
	cout<<"The orginal arrayare:"<<endl;
	for(k=0;k<len;k++)
		cout<<array[k]<<",";
	cout<<endl;
	quickSort(array,0,len-1);
	cout<<"The sorted arrayare:"<<endl;
	for(k=0;k<len;k++)
		cout<<array[k]<<",";
	cout<<endl;
	system("pause");
	return 0;
}

void quickSort(int s[], int l, int r)
{
	if (l< r)
	{      
		int i = l, j = r, x = s[l];
		while (i < j)
		{
			while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
				j--; 
			if(i < j)
				s[i++] = s[j];
			while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
				i++; 
			if(i < j)
				s[j--] = s[i];
		}
		s[i] = x;
		quickSort(s, l, i - 1); // 递归调用
		quickSort(s, i + 1, r);
	}
}


原文地址:http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现快速排序(源代码) 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 基于multisim 实现的“出租车计价器的设计与仿真”

    1 设计要求 1 计费器具有行车里程计费 等候时间计费及起价等三部分 3位数码管显示最大金额为99 9 单位 元 2 行车里程单价 00元 等候时间单价 00元 5分钟 及起价 00元 均可以由键盘输入 此实验中行车里程单价和等候时间单价均
  • chatgpt赋能python:Python反向查找字符——一个强大的文本处理工具

    Python反向查找字符 一个强大的文本处理工具 在搜索引擎优化中 文本处理是非常关键的一环 其中 反向查找字符在文本处理中也扮演着一个重要的角色 能够帮助我们快速地定位和处理文本中的特定内容 在这篇文章中 我们将介绍反向查找字符在Pyth
  • Linux下which、whereis、locate、find 命令的区别

    http blog chinaunix net uid 20554039 id 3035417 html 我们经常在linux要查找某个文件 但不知道放在哪里了 可以使用下面的一些命令来搜索 这些是从网上找到的资料 因为有时很长时间不会用到
  • 管理科学基础知识__后悔值计算

    看一个例题 某企业要投产一种新产品 生产方案有四种 A 新建全自动生产线 B 新建半自动生产线 C 购置旧生产设备 D 外包加工生产 未来该产品的销售前景估计为很好 一般和较差三种 不同情况下该产品的收益值如下表所示 单位 万元 用后悔值
  • 【Python】解决AttributeError: ‘xml.etree.ElementTree.Element‘ object has no attribute ‘getchildren‘问题

    getchildren在python 3 9中已经被移除 如果项目中使用会显示错误 AttributeError xml etree ElementTree Element object has no attribute getchildr
  • python中strptime()和strftime()的区别和用法

    python中strptime 和strftime 的区别和用法 之前每次遇到时间格式转换都要去搜 今天决定自己记录一下这两个方法的区别和用法 也方便自己加深印象 1 strptime中的p代表parse 意为解析 也就是将一个字符串解析成
  • 【点宽专栏】国泰君安——综合期限多样性的趋势选股策略

    前言 此策略报告策略构建部分参考 国泰君安综合期限多样性的趋势选股策略数量化专题之九十 原报告思想 移动平均线由于具有简单直观的特征 是最常用的技术指标之一 除了简单发送多空信号之外 移动平均指标作为历史股价走势信息的载体 能够对未来收益起
  • Python Pandas 列数据筛选方法汇总

    Pandas 列数据筛选方法汇总 数据准备 一 筛选得到指定的列 1 1 根据 label 选择特定的几列 1 2 选择单列的两种方式 1 3 通过正则表达式选择列 二 同时对 行 和 列 进行筛选 2 1 通过切片 df loc 2 2
  • pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

    本来 前辈们用caffe搭建了一个squeezenet的工程 用起来也还行 但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的 以下的环境搭建不再细说 主要就是pyorch 其余的需要什么
  • 【Java】Java中的多态

    文章目录 一 什么是多态 二 多态实现的条件 三 重写 3 1 什么是重写 3 2 重写和重载的区别 四 向上转型和向下转型 4 1 向上转型 4 2 向下转型 五 多态的优缺点 六 避免在构造方法中调用重写的方法 一 什么是多态 在Jav
  • MySQL多表关联查询

    文章目录 多表查询 用户表 用户角色表 角色表 权限表 角色权限表 表间关系 MySQL连接 关联查询用户表和用户角色表 关联查询用户表 用户角色表和角色表 多表连接 笛卡尔集 外连接
  • 软件测试报告可以包含哪些测试内容?

    软件测试报告可以包含以下测试内容 功能测试 测试软件的基本功能是否实现 是否符合要求 性能测试 测试软件的响应速度 并发能力 稳定性等性能指标 界面测试 测试软件的用户界面是否友好 易于使用 兼容性测试 测试软件在不同的操作系统 浏览器 设
  • Springboot中 @ConfigurationProperties对象 静态方法调用无效

    1 https blog csdn net weixin 43404791 article details 105430606 2 https blog csdn net qq827245563 article details 106296
  • 三行代码求二叉树的节点个数以及二叉树的深度

    二叉树的节点格式如下 struct BinaryTreeNode int m nValue BinaryTreeNode m pLeft BinaryTreeNode m pRight 1 求二叉树的节点个数 这道题比较简单 使用随便一种遍
  • TI DSP TMS320C66x学习笔记之VLIB测试数据(三)

    VLIB是TI提供的针对C6x优化过的视觉库 下载地址 http software dl ti com libs vlib latest index FDS html 提供40多个核心函数 主要实现以下功能 Background Model
  • SpringBoot+vue旅游项目总结

    Springboot vue旅游项目小总结 此项目为一个springboot vue入门级小项目 视频地址为 https www bilibili com video BV1Nt4y127Jh 业务简单 对提升业务能力没什么大的帮助 更多的
  • 开始→运行→输入的命令集锦

    gpedit msc 组策略 sndrec32 录音机 nslookup ip地址侦测器 explorer 打开资源管理器 logoff
  • 最后一位

    题目名称 最后一位 小明选择了一个正整数X 然后把它写在黑板上 然后每一天他会擦掉当前数字的最后一位 直到他擦掉所有数位 在整个过 程中 小明会把所有在黑板上出现过的数字记录下来 然后求出他们的总和sum 例如X 509 在黑板上出现过的数
  • vue打包放服务器显示代码,解决vue-cli3打包代码后,上线服务器后白屏问题

    前沿 因为最近vue刚刚发版了最新版本的vue cli3 而最近刚刚好有个项目要迁移到vue 所以经过讨论 大家一起入坑VUE 然后我也刚好可以练手刚学一周的vue 结合TypeScript和vuex等全家桶的框架 后期 噗呲噗呲的大家在开
  • C++实现快速排序(源代码)

    快速排序的基本思想是 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此达到整个数据变成有序序列 快速排序是一种不稳