快速排序详讲(两种方法)

目录

原理

实现方式

正常实现

理由

先从右到左,在从左到右

先从左到右,先从右到左

挖坑法

效率

优化

测试

代码


原理

快速排序是将最左侧的数字当作关键数字,将关键数字放在对应位置,且关键数字左侧均大于它,右侧均小于它,采用递归的形式左右执行递归

实现方式

正常实现

升序排序:

先从右往左

如果开始位置小于结束位置并且当前位置大于关键数字则继续往左查找

再从左往右

如果开始位置小于结束位置并且当前位置小于关键数字则继续往左查找

两个结束后,此时begin位置大于关键数字,end位置小于,交换begin与end即可实现将关键数字左右两侧满足条件

当begin<end时继续执行如上操作

注意:先从右往左再从左往右不能进行交换

理由

先从右到左,在从左到右

右侧先停,左碰到右,则右侧此时位置小于关键数字,左碰到右,可保证相遇位置数字小于关键数字

左侧先停,右碰到左此时左侧位置为上一轮交换后的位置,即左侧此时小于关键数字,右碰到左,可保证相遇位置数字小于关键数字

先从左到右,先从右到左

与上相反

挖坑法

取出最左侧的数据

进入循环

同样从右往左查找,但是比较的是当前位置和关键数字的值

效率

和堆排序,希尔排序为同一级别

排序100000个数,快排和希尔均只用了10几ms,而冒泡则用了30s

优化

1.

我们可以将第一个数的位置和最后一个数的位置取出,创建mid=(left+right)/2,关键数字则为第一个数,最后一个数和mid三者之间的中间值,将中间值和首元素进行交换即可

2.

当元素个数小于10时,插入排序效率比快排更高,我们可以在此时使用插入排序代替快排

测试

一百万个数据

通过比较后我们可以发现

挖坑法比普通快排快一些,但是差距不大

优化后确实会比没优化要稍微快上一些

代码

void swap(int* p1, int* p2) {
	int a = *p1;
	*p1 = *p2;
	*p2 = a;
}
void insertsort(int* a, int sum) {//插排
	int begin, end, tmp;
	for (begin = 0; begin < sum - 1; begin++) {
		tmp = a[begin + 1];
		end = begin;
		while (end >= 0) {
			if (a[end] > tmp) {
				a[end + 1] = a[end];
				end--;
			}
			else
				break;
		}
		a[end + 1] = tmp;
	}
}
int findmid(int* a, int left, int right) {。。中间值
	int mid = (left + right) / 2;
	if (a[left] > a[mid]) {
		if (a[mid] > a[right])
			return mid;
		else {
			if (a[left] > a[right])
				return right;
			return left;
		}
	}
	else {
		if (a[left] > a[right])
			return left;
		else {
			if (a[mid] > a[right])
				return right;
			return mid;
		}
	}
}
void normalquick(int* a, int left, int right) {//普通
	if (left >= right)
		return;
	int begin = left, end = right, key = left;
	while (begin < end) {
		while (begin < end && a[end] >= a[key])
			end--;
		while (begin < end && a[begin] <= a[key])
			begin++;
		swap(&a[begin], &a[end]);
	}
	swap(&a[begin], &a[key]);
	key = begin;
	normalquick(a, left, key - 1);
	normalquick(a, key + 1, right);
}
void quicksort(int* a, int left, int right) {//优化快排
	if (left >= right)
		return;
	if (right - left + 1 < 10) {
		insertsort(a + left, right - left + 1);
		return;
	}
	int begin = left, end = right, key = findmid(a, left, right);
	swap(&a[begin], &a[key]);
	key = left;
	while (begin < end) {
		while (begin < end && a[end] >= a[key])
			end--;
		while (begin < end && a[begin] <= a[key])
			begin++;
		swap(&a[begin], &a[end]);
	}
	swap(&a[begin], &a[key]);
	key = begin;
	quicksort(a, left, key - 1);
	quicksort(a, key + 1, right);
}
void quicksorthoare(int* arr, int left, int right) {//挖坑法
	if (left >= right)
		return;
	int begin=left, end=right, key=arr[left];
	while (begin < end) {
		while (begin < end && arr[end] >= key)
			end--;
		arr[begin] = arr[end];
		while (begin < end && arr[begin] <= key)
			begin++;
		arr[end] = arr[begin];
	}
	arr[begin] = key;
	quicksorthoare(arr, left, begin - 1);
	quicksorthoare(arr, begin + 1,right);
}
void shellsort(int* arr, int sum) {//希尔排序
	int i, j, gap=sum, tmp,a;
	while (gap > 1) {
		gap = gap / 3 + 1;
		for (i = 0; i < gap; i++) {
			for (j = i; j < sum - gap; j+=gap) {
				tmp = arr[j + gap];
				a = j;
				while (a >= 0) {
					if (arr[a] > tmp) {
						arr[a + gap] = arr[a];
						a -= gap;
					}
					else
						break;
				}
				arr[a + gap] = tmp;
			}
		}
	}
}
void hoarequick(int* a, int left, int right) {//优化挖坑
	if (left >= right)
		return;
	if (right - left + 1 < 10) {
		insertsort(a + left, right - left + 1);
		return;
	}
	int begin = left, end = right, key = findmid(a, left, right);
	swap(&a[begin], &a[key]);
	key = a[left];
	while (begin < end) {
		while (begin < end && a[end] >= key)
			end--;
		a[begin] = a[end];
		while (begin < end && a[begin] <= key)
			begin++;
		a[end] = a[begin];
	}
	a[begin] = key;
	hoarequick(a, left, begin - 1);
	hoarequick(a, begin + 1, right);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/669621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】【STWave】时空图预测,车流量预测,Efficient Spectral Graph Attention Network

Spatio-Temporal meets Wavelet: Disentangled Traffic Flow Forecasting via Efficient Spectral Graph Attention Network 代码&#xff1a;https://github.com/LMissher/STWave 论文&#xff1a;https://arxiv.org/abs/2112.02740 帮助&#xff1a; https://docs.qq.com/s…

使用pycharm+opencv进行视频抽帧(可以用来扩充数据集)+ labelimg的使用(数据标准)

一.视频抽帧 1.新创建一个空Pycharm项目文件&#xff0c;命名为streach zhen 注&#xff1a;然后要做一个前期工作 创建opencv环境 &#xff08;1&#xff09;我们在这个pycharm项目的终端里面输入下面的命令&#xff1a; pip install opencv-python --user -i https://pypi.t…

【Kubernetes】Pod理论详解

一、Pod基础概念&#xff1a; Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行…

网页音频提取在线工具有哪些 网页音频提取在线工具下载

别再到处去借会员账号啦。教你一招&#xff0c;无视版权和地区限制&#xff0c;直接下载网页中的音频文件。没有复杂的操作步骤&#xff0c;也不用学习任何代码。只要是网页中播放的音频文件&#xff0c;都可以把它下载到本地保存。 一、网页音频提取在线工具有哪些 市面上的…

python的元组

元组与列表的区别 元组和列表非常相似。不同之处在于&#xff0c;外观上&#xff1a;列表是被 方括号 包裹起来的&#xff0c;而元组是被 圆括号 包裹起来的。本质上&#xff1a;列表里的元素可修改&#xff0c;元组里的元素是 不可以“增删改” 。 还有一个微妙的地方要注意…

网络研究观-20240601

新战争时代的商业风险 美国人已经将战争视为遥远战场上发生的事件。然而&#xff0c;网络空间打破了这种看法&#xff0c;让全球战争的真正影响来到了美国家门口。 攻击不再局限于遥远的战场&#xff0c;而是在最意想不到的时间和地点发动袭击。 谁将主宰第五次工业革命&…

智慧校园的机遇与挑战

随着5G、物联网、大数据等技能的日渐老练&#xff0c;数字化正在渗透到各行各业中&#xff0c;为事务立异和价值增加供给支撑。在教育职业&#xff0c;运用智能化体系赋能教育办理越来越受欢迎&#xff0c;教育信息化方针一再出台&#xff0c;进一步加快了智慧校园落地的脚步。…

Dijkstra求最短路篇一(全网最详细讲解两种方法,适合小白)(python,其他语言也适用)

前言&#xff1a; Dijkstra算法博客讲解分为两篇讲解&#xff0c;这两篇博客对所有有难点的问题都会讲解&#xff0c;小白也能很好理解。看完这两篇博客后保证收获满满。 本篇博客讲解朴素Dijkstra算法&#xff0c;第二篇博客讲解堆优化Dijkstra算法Dijkstra求最短路篇二(全网…

联合和枚举(自定义类型)

1.枚举&#xff08;关键字&#xff1a;enum) 1.1枚举类型的声明 把可能的值一一列举 赋的值是可能取值 1.2枚举类型的优点 1&#xff09;增加代码的可读性和可维护性 2&#xff09;和#define定义的标识符比较枚举有类型检查&#xff0c;更加严谨 3&#xff09;便于调试&a…

【C++】list的使用(下)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;操作list对象的接口函数&#xff08;opeartions&#xff09;spliceremoveremove_ifuniquemergesortreverse 结语 前言 本篇博客主要内容&#xff1a;STL…

智能合约引领:探索Web3的商业革新之路

随着区块链技术的迅速发展&#xff0c;智能合约作为其重要应用之一&#xff0c;正在逐步改变着商业世界的格局。Web3作为下一代互联网的代表&#xff0c;正引领着智能合约在商业领域的广泛应用和创新。本文将深入探讨智能合约在Web3中的作用&#xff0c;以及智能合约如何引领着…

「计网」网络初识

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 网络初识 &#x1f349;IP 地址 & 端口号&#x1f349;网络协议&#x1f34c;TCP/IP 网络协议 &#x1f349;封装和分用&#x1f349…

Xcode设置cocoapods库的最低兼容版本

目录 前言 1.使用cocoapods遇到的问题 2.解决办法 1.用法解释 1. config.build_settings: 2.IPHONEOS_DEPLOYMENT_TARGET 2.使用实例 3.注意事项 1.一致性 2.pod版本 前言 这篇文章主要是介绍如何设置cocoapods三方库如何设置最低兼容的版本。 1.使用cocoapods遇到的…

小红书图片视频下载利器,无水印!

在刷小红书时&#xff0c;总能看到一些博主发的好看的壁纸或者视频&#xff0c;想下载下来做头像或者设置为手机电脑的桌面。不过众所周知&#xff0c;直接保存的图片和视频都是有水印的&#xff0c;那如何去掉水印呢&#xff1f; 有些朋友肯定说&#xff0c;我知道有去水印的…

如何区分解析亚马逊网站产品搜索结果页HTM代码中广告位( Sponsored)和自然位的产品ASIN及排名

在开发亚马逊产品广告排名插件的时候需要通过页面HTML代码分别找出属于广告位和自然搜索结果的产品ASIN及排名&#xff0c;所以需要找到区分广告位和自然搜索结果的HTML代码属性&#xff1a; 所有搜索结果页的产品不管是广告位还是自然位&#xff0c;都包括在 标签里&#xff…

服务器数据恢复—服务器raid常见故障表现原因解决方案

RAID&#xff08;磁盘阵列&#xff09;是一种将多块物理硬盘整合成一个虚拟存储的技术&#xff0c;raid模块相当于一个存储管理的中间层&#xff0c;上层接收并执行操作系统及文件系统的数据读写指令&#xff0c;下层管理数据在各个物理硬盘上的存储及读写。相对于单独的物理硬…

kali中切换python版本

kali中切换python版本 在日常使用的过程中&#xff0c;可以通过一些工具来做打靶环境&#xff0c;或者工具的启动&#xff0c;都和python关联&#xff0c;而有时存在工具安装&#xff0c;或者运行的时候出现报错&#xff0c;这时候极大可能是因为我们本地的kali中python的版本不…

安装pytorch深度学习模型时要知道自己的电脑显卡是否支持CUDA

安装pytorch深度学习模型时要知道自己的电脑显卡是否支持CUDA&#xff0c;如何知道自己的显卡是否支持呢&#xff1f;可以去下面的网站&#xff0c;打开后就可以见到如下图所示&#xff1a; CUDA | 支持的GPU | GeForce (nvidia.cn)

【Mac】XMind for mac(XMind思维导图)v24.04.10311软件介绍和安装教程

软件介绍 XMind for Mac是一款功能强大的思维导图软件。它具有以下主要特点&#xff1a; 1.多样化的思维导图功能&#xff1a;XMind for Mac提供了丰富的思维导图编辑功能&#xff0c;用户可以创建各种类型的思维导图&#xff0c;包括组织结构图、逻辑图、时间轴图等&#xf…

基于优化Morlet小波的一维信号瞬态特征提取方法(MATLAB R2018A)

小波分析方法近些年逐步得到发展的一门数学分析技术&#xff0c;它对许多学科都有十分重要的影响。与傅立叶变换等其他传统方法相比&#xff0c;小波分解的方法中所用的小波基有着多种多样的结构&#xff0c;总结来说又包括正交小波系与非正交小波系。正交小波在信号处理领域目…