快速排序(C语言简单实现)

2023-11-17

快速排序(C语言简单实现)

快速排序(Quick Sort)是冒泡排序的升级版。基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。对快速排序过程的理解:https://www.runoob.com/w3cnote/quick-sort.html

/* 对顺序表L作快速排序 */
void QuickSort(SqList *L){
   
	QSort(L, 1, L->length);
}
/* 对顺序表L中的子序列L->r[low.high]作快速排序 */
void QSort(SqList *L, int low, int high){
   
	int pivot;
	if(low<high){
   
		pivot = Partition(L, low, high);	//将L->r[low..high]一分为二,算出枢轴值pivot
		QSort(L, low, pivot-1);	//对低子表递归排序
		QSort(L, pivot+1, high);	//对高子表递归排序
	}
}
/* 交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大(小)于它 */
int Partition(SqList *L, int low, int high){
   
	int pivotkey;
	pivotkey = L->r[low];	//用表的第一个记录作枢轴记录
	while(low < high){
   	//从表的两端交替向中间扫描
		while(low < high && L->r[high] >= pivotkey)
			high--;
		swap(L, low, high);		//将比枢轴记录小的记录交换到低端
		while(low < high && L->r[low] <= pivotkey)
			low++;
		swap(L, low, high);	//
将此枢轴记录大的记录交换到高端
	}
	return low;	//返回枢轴所在位置
}

复杂度分析

快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。

在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树的深度就为log2(n)+1向下取整,即仅需递归log2(n)次,需要时间为T(n)的话,那么第一次Partition应该是需要对整个数组扫描一边,作n次比较,然后,获得的枢轴将数组一分为二,各自还需要T(n/2)的时间(最好情况下才平分)。综合起来,最优情况下,快速排序算法的时间复杂度为O(nlogn)

最坏情况下,待排序列为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,会是一棵斜树。此时需要执行n-1次递归调用,且第i次需要经过n-1次关键字的比较才能找到第i个记录,也就是枢轴的位置,因此最终比较次数为O(n^2)

平均情况下,时间复杂度为O(nlogn)

空间复杂度,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2(n),其空间复杂度也就为O(logn),最坏情况,需要进行n-1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)

因为是跳跃着比较和交换的,所以,快速排序时一种不稳定的排序方法。

快速排序优化

优化选取枢轴

三数取中法:即取三个关键字先进行排序,将中间数作为枢轴,一般取左端,右端和中间三个数,也可以随机取,这样子至少这个中间数一定不会是最小或者最大。从概率上来说,取到三个数均为最小或最大的可能性微乎其微,因此中间数位概率大大提高。由于整个序列是无序状态,随机选取三个数和从左中右取三个数其实是一样的,而且随机数生成器本身还会带来时间上的开销,因此随机生成不予考虑。

修改代码,在Partition函数代码的第3和4行之间增加一段代码:

int pivotkey;

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

快速排序(C语言简单实现) 的相关文章

随机推荐

  • (支付宝支付)Spring实现一个项目配置多个信息、付款给对应商户

    如何实现一个项目配置多个商户信息付款给对应商户 最近在对接支付宝支付时 遇到了一个问题 用户在付款时 需要直接付款到指定支付宝账户 这个需求也无可厚非 就像我们公司有四个分公司 分别在北京 上海等地 如果钱只能到总公司的账户上 那在财务结算
  • linux c do while循环,C语言do-while循环

    要执行程序或代码的一部分几次或多次 我们可以使用C语言的do while循环 在do和while之间给出的代码将被执行 直到条件 condition 成为true 在do while循环中 语句在条件之前给出 所以语句或代码将至少有一次执行
  • Wav2lip-GAN 环境配置

    首先使用 conda 创建新的虚拟环境 然后激活这个环境 conda create n myenv python 3 8 activate myenv 使用 git 克隆代码 或者直接下载源码压缩包解压 安装依赖 我使用的豆瓣源 git c
  • 热部署,未测试

    package agent import java lang instrument Instrumentation import java lang instrument UnmodifiableClassException import
  • 在子类的override方法中调用父类的父类的未被重写的方法

    今天做一个自定义控件 扩展TableLayoutPanel这个控件加一些自己的属性 重写OnPaintBackground这个虚方法 控件的继承关系是这样的 Control ScrollableControl Panel TableLayo
  • 5_spring-cloud-zuul-网关

    文章目录 网关 链路追踪 Zuul zuul 原理 负载均衡设置 配置指定服务的路由 重定向 忽略服务 禁止直接请求 前缀配置 暴露路由端点 网关 链路追踪 Zuul Sleuth https start aliyun com Zuul是N
  • 软件测试学习规划路线

    现如今互联网行业飞速发展 IT行业也是水涨船高 软件行业的未来发展也是越来越好 而软件测试在软件行业可谓是一个必不可少的职业 它不仅算得上一个长青工作 而且也是一个在需求持续增长的职业 如果你已经入行软件测试了 那就沉住气继续努力下去 保持
  • MyEclipse新建Maven webapp项目

    MyEclipse中创建新的Maven项目 webapp目录结构 过程如下 1 New gt Project gt Maven Project 2 Next 3 Next 选择 maven archetype webapp 创建一个weba
  • 编程教育案例

    1 Osmo Coding早教玩具 可以编代码的智能版乐高 https www playosmo com zh cn schools https digi tech qq com a 20160527 055566 htm https ww
  • BUUCTF Misc [GXYCTF2019]SXMgdGhpcyBiYXNlPw== & 间谍启示录 & Mysterious & [UTCTF2020]docx

    目录 GXYCTF2019 SXMgdGhpcyBiYXNlPw 间谍启示录 Mysterious UTCTF2020 docx GXYCTF2019 SXMgdGhpcyBiYXNlPw 下载文件 base64隐写 使用脚本 base64
  • linux下apt-get install软件出现,E: 未发现软件包

    在debian虚拟机中安装库时 总是提示E 未发现软件包 libXtst dev 搜索后发现可能是缺少软件源 打开 etc apt sources list 发现所有语句均被注释 搜索了很多 最后使用的Debian镜像使用帮助的使用样例 在
  • ps如何把人物扣下来

    做前端的难免会自己用上ps 我在网上看了很多关于ps如何把人物扣下来的 我给大家分享一下自己的一些见解 首先打开ps工具 里面放上一张图片 放进去图片之后什么东西都不用动 第二步 shift 键可以扩大选取 ail键可以减小选取 第三步 完
  • 区块链学习笔记(一)

    https zhuanlan zhihu com p 23243289 1 区块的数据结构 区块高度 每个区块的唯一ID 块高度为0的创世块 一段时间生成一个块 高度加1 头哈希 每个区块的唯一哈希值 根据父哈希 数据块哈希 随机数生成 父
  • 程序人生-Hello’s P2P[HITICS-大作业]

    计算机系统 大作业 题 目 程序人生 Hello s P2P 专 业 计算机科学与技术学院 学 号 1180301006 班 级 1803010 学 生 宋永玺 指 导 教 师 史先俊 计算机科学与技术学院 2019年12月 摘 要 一个简
  • Java 中j+=i 和 j=+i 的区别

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 一 j i 意思就是 把i获取到的值与j相加 之后再把值赋给j 更新j的值 换句话说 j j i 写下代码更好的理解一下 Test pu
  • 静态绑定和动态绑定

    对于非虚成员函数 是静态绑定的 而虚函数都是动态绑定 如此才可实现多态性 这也是 语言和其它语言Java Python的一个显著区别 几个名词定义 静态类型 对象在声明时采用的类型 在编译期既已确定 动态类型 通常是指一个指针或引用目前所指
  • vscode按住ctrl+鼠标左键无法跟踪跳转方法名【带vscode编辑PHP的配置教程】

    今天刚装好vscode 发现vscode按住ctrl 鼠标左键无法跟踪跳转方法名 其实就是装一个插件就好了 vscode elm jump 常规的代码跳转定义 Vue CSS Peek 按ctrl可以跳转css定义 vue helper 变
  • ZooKeeper(六)权限管理机制

    一 ZooKeeper权限管理机制 1 1 权限管理ACL Access Control List ZooKeeper 的权限管理亦即ACL 控制功能 使用ACL来对Znode进行访问控制 ACL的实现和Unix文件访问许可非常相似 它使用
  • 【解决】CommandNotFoundError: Your shell has not been properly configured to use conda activate

    在linux系统中 安装了anaconda 配置了conda环境变量 也使用conda命令创建了新的环境my env 但在使用conda激活时 报错 报错问题 输入 conda activate my env 报错 CommandNotFo
  • 快速排序(C语言简单实现)

    快速排序 C语言简单实现 快速排序 Quick Sort 是冒泡排序的升级版 基本思想 通过一趟排序将待排记录分割成独立的两部分 其中一部分记录的关键字均比另一部分记录的关键字小 则可分别对这两部分记录继续进行排序 以达到整个序列有序的目的