快速排序(hoare版本)

文章目录

文章目录

前言

二、使用步骤

1.实现基准值

2.递归实现排序

3.三数取中 

三.注意事项

总结


前言

我们之前学习的多种排序,它们都有着不同的效率,可以适用与不同的场景,接下来要说的一种排序它叫做快速排序,从它的名字就可以看出来它的效率一定很高。


一、快速排序的实现

        快速排序的实现就如图一样,先右边的开始走如果碰到比key值小的数值就在那个位置停下,然后左边开始执行,如果碰到比key值大的也同样停止,然后对两者进行交换。最后左和右相遇后将key和相遇的地方进行交换从而使得左边是比key小的值,右边是比key大的值,使用递归实现排序。

二、使用步骤

1.实现基准值

这是霍尔大佬最先发明写出的算法,同样的也是最经典的,同样的也好理解,通过交换的方法从而做到左边的比key要小,右边的比key要大。

代码如下(示例):

int Partsort(int* a, int left, int right)
{
    
    int begain = left;
    int end = right;
    int key = begain;
    while (begain < end)
    {
        while (begain < end && a[end] >= a[key])
        {
            --end;
        }
        while (begain < end && a[begain] <=a[key])
        {
            ++begain;
        }
        Swap(&a[begain], &a[end]);
    }
    Swap(&a[key], &a[begain]);
    return begain;
}

 

2.递归实现排序

通过递归的方式,我们可以使得数都满足左边的值大于右边从而实现排序。

代码如下(示例):

void qucksort(int* a, int left, int right)
{
	if (left >= right)
		return;
	int key = Partsort(a, left, right);
	qucksort(a, left, key - 1);
	qucksort(a, key + 1, right);
}

3.三数取中 

我们有时会因为key的值太小或者太大从而发挥不出快速排序的优势,所以我们可以使用自己的方式从而使其不会太大或者太小,所以三数取中就出现了,通过比较最左边和最右边以及中间的数来比较出那个的值是比较趋于中间的数。

int mid(int* a, int left, int right)
{
	int mid = (left + right) / 2;
	if (a[left] > a[right])
	{
		if (a[mid] > a[left])
		{
			mid = left;
		}
		else if (a[mid] < a[right])
		{
			mid = right;
		}
	}
	else if (a[left] < a[right])
	{
		if (a[mid] < a[left])
		{
			mid = left;
		}
		else if (a[mid] > a[right])
		{
			mid = right;
		}
	}
	return mid;

}

三.注意事项

        我在编写代码的时候当时我认为我的思路都是正确的,代码写的也是正确的,但是就是无法实现排序,后面我发现了先走右边和先走左边是会对结果造成影响的,我最开始写的是从左边开始走,但是排序的结果是不正确的,从右边开始的话就正确了,因为我所设置的key就为数组的最左边,如果我先走左边的话,最后的结果就为当left和right相遇的时候就该进行交换了,而这个时候交换的话无法保证左边的数比key要小,因为先走左边的时候就会在比key的大的值位置停下,最后也只能在这个位置停下。

        所以实现排序的时候也要注意是先走的左边还是先走的右边,这样的小细节也是会影响到结果的实现。


总结

排序的方式有很多种,我们可以根据不同的实现场景来使用不同的代码,快速排序是一种效率很高的排序,很多函数内置的排序就是使用的快速排序,实现的原理并不困难,但是我们需要注意其中的细节,这样就可以省去不必要的麻烦。

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

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

相关文章

从产品经理到AI产品经理,这波升职加薪我把握住了

2024年&#xff0c;还有什么新风口&#xff1f; AI、元宇宙、NFT… 很多人不知道&#xff0c;其实不管是元宇宙还是NFT&#xff0c;它们本质上就是人工智能领域。 AI自身应用领域非常广泛&#xff0c;大批高薪岗位随之涌了出来&#xff0c;包括AI产品经理。 AI产品经历具体工…

微软运用欺骗性策略大规模打击网络钓鱼活动

微软正在利用欺骗性策略来打击网络钓鱼行为者&#xff0c;方法是通过访问 Azure 生成外形逼真的蜜罐租户&#xff0c;引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据&#xff0c;微软可以绘制恶意基础设施地图&#xff0c;深入了解复杂的网络钓鱼操作&#xff…

数字化工厂:制造业转型的新引擎

在当前技术飞速发展的时代,数字化正以前所未有的速度深入到各个行业,推动着产业转型升级。制造业作为国民经济的支柱,更是数字化转型的重点领域。随着5G、大数据、云计算、人工智能等新一代信息技术的广泛应用,以及国家"工业4.0"、"中国制造2025"等政策的持…

05-服务保护和分布式事务

原文为黑马程序员的飞书云文档&#xff0c;链接在这&#xff1a;原文链接 在微服务的远程调用中&#xff0c;还存在几个问题需要解决&#xff1a; 首先是业务健壮性问题&#xff1a; 在之前的查询购物车列表的业务中&#xff0c;购物车服务需要查询最新的商品信息&#xff0…

语音语言模型最新综述! 关于GPT-4o背后技术的尝试

近期,大型语言模型(LLMs)在生成文本和执行各种自然语言处理任务方面展现出了卓越的能力,成为了强大的AI驱动语言理解和生成的基础模型。然而&#xff0c;仅依赖于基于文本模态的模型存在显著局限性。这促使了基于语音的生成模型的发展,使其能够更自然、直观地与人类互动。 为了…

Prism 四事件聚合器

#1024程序员节&#xff5c;征文# 不废话&#xff0c;直接上代码一个简单的示例。 1、事件聚合 创建一个文件夹EventBLL&#xff0c;添加EventDemo.cs&#xff0c;代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using …

SpringMVC6-SpringMVC的视图

目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口&#xff0c;视图的作用&#xff1a;渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图InternalResourceView 和重定…

卷积神经网络评价指标

1.评价指标的作用 1. 性能评估&#xff1a;评价指标提供了一种量化的方式来衡量CNN模型的性能。通过这些指标&#xff0c;我们可以了解模型在特定任务上的表现&#xff0c;比如图像分类、目标检测或图像分割等。 2. 模型比较&#xff1a;不同的模型架构或训练策略可能会产生不…

UWA Gears:Frame Capture模式 - 着色器查看器

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 在上周的文章中&#xff0c;我们详细介绍了网格查看器的功能&#xff0c;介绍如何通过网格数据优化…

Deepin V23 / 统信UOS 下安装与配置 tftp

几个月前&#xff0c;我将开发系统从 ubuntu 切换到 Deepin&#xff0c;当时写过一篇文章《使用国产操作系统作为开发系统》。几个月下来&#xff0c;没有感觉有什么不适应&#xff0c;Ubuntu 能做的事情&#xff0c;在 Deepin 上都能做。而且有 UOS 应用商店的加持&#xff0c…

Linux: Shell编程入门

Shell 编程入门 1 ) Shell 概念 shell 是 在英语中 壳, 外壳的意思可以把它想象成嵌入在linux这样的操作系统里面的一个微型的编程语言不像C语言, C 或 Java 等编程语言那么完整&#xff0c;它可以帮我们完成很多自动化任务例如保存数据监测系统的负载等等&#xff0c;我们同样…

数学之三角函数

小时候总是听别人讲甚么三角函数&#xff0c;感觉十分高大上&#xff0c;像是很深奥的知识。 今天我来讲解一下三角函数&#xff0c;首先就是概念了。 三角函数的概念&#xff08;初中&#xff09;&#xff08;入门难度&#xff09; 三角函数顾名思义就属于函数。那么它和三角…

51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25

51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25 声明:本文图片来源于网络 A模拟信号特点: 电压或者电流 缓慢上升 随着时间连续缓慢上升或下降 D数字信号特点:电压或者电流 保持一段时间的高/低电平 状态 / 突变 (高电压瞬间低电压) 数字电路中 通常将0-1v电压称…

JavaScript高级特性速成指南:原型链、严格模式、高阶函数、闭包、递归、浅拷贝和深拷贝

如果生活中有什么使你感到快乐&#xff0c;那就去做吧&#xff0c;不要管别人说什么 文章目录 原型链严格模式高阶函数闭包递归浅拷贝和深拷贝 原型链 概念&#xff1a;就是串联起来的结构作用&#xff1a;提供一个成员的查找机制或者查找规则 Javascript的成员查找机制(规则)…

resources下lib文件中的jar包怎么添加到git

这里讲怎么处理这部分的问题&#xff1a; 1&#xff1a;java maven resource 目录下的jar无法被添加到git 2&#xff1a;使用git命令添加jar包时报错&#xff1a;The following paths are ignored by one of your .gitignore files: ***&#xff0c;use -if **** 上面都是相同…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

Spring Boot技术中小企业设备管理系统设计与实践

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1

启动springboot项目时&#xff0c;出现了以下报错&#xff1a; defaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDdefaultPattern_IS_UNDEFINEDjava.lang.IllegalStateException: Failed to load property source from location classpath:/application-local.yamlat o…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

【Sublime Text】设置中文 最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…