题集-三路划分和三数取中(快排优化)

news2024/11/25 21:23:56

快排排序是非常快的,但是有一种情况快排是无法进行的。

912. 排序数组 - 力扣(LeetCode)

这道题看上去没什么问题,但是如果我们用快排去提交的话,发现快排其实是被针对了的。

有一个样例是这样的。如果我们按照快排的思想,right指针将一路狂奔到left指针这里回合,然后每次分割区间都是只分割出去一个数,这样就会造成时间超限。

所以我们将快排进行优化,实现三路划分

原来的快排思想是将小于等于key的放在左边,将大于等于key的放在右边,这样形成了两个区间。

三路划分的思想其实就是,将小于key的放在左边,将大于key的放在右边,将等于key的放在中间。

然后分割区间的时候,左边小于key的一个,右边大于key的一个,中间的就不用再动了

具体操作的方法:

还是left在左侧,right在右侧,current遍历。

当current遇到比key小的,就将current下的值和left交换,然后将left++,current++。(因为left为和key相等的值,交换过后left++,相当于是left左边是比key小的值,left永远指向和key相等的值)

当current遇到和key相等的值时,就将current++,继续遍历。

当current遇到比key大的值,就将current下的值和right交换,然后将right--(不先管right原位置的值的大小,先交换,此时right--后,right右侧的值则永远都是比key大的值,current不动,因为不确定交换后的值的大小。进行新一轮的比较之后,再决定去留)

代码:


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int GetMidIndex(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[right] < a[left])
		{
			return left;
		}
		else return right;
	}
	else
	{
		if (a[mid] > a[right])
			return mid;
		else if (a[left] < a[right])
			return left;
		else return right;
	}

}
 void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void QuickSort(int* a, int begin, int end)
{
    if (begin >= end)
	{  
		return;
	}
  int left = begin;
  int current = left+1;
  int right = end;
	int midi = GetMidIndex(a, left, right);
	Swap(&a[left], &a[midi]);
	int key = a[left];
	while (current <= right)
	{
		if(a[current] > key)
		{
			Swap(&a[current], &a[right]);
            right--;
		}
		else if(a[current] < key)
		{
            Swap(&a[current], &a[left]);
						left++;
						current++; 
		}
        else 
        current++;
	}
	QuickSort(a, begin,left-1);
	QuickSort(a, right+1, end);
}
int* sortArray(int* nums, int numsSize, int* returnSize){
    QuickSort(nums,0,numsSize-1);
    *returnSize = numsSize;
    return nums;
}

提交还有样例没过

做出三路划分后,这个样例针对的是快排的三数取中(GetMidIndex)方法。

但是如果去掉三数取中方法,当遇到接近有序的序列后就会超时。所以我们不能用普通的三数取中方法。

 int GetMidIndex(int* a, int left, int right)
{
	int mid = left+(rand()%(right-left));      //中间的数不再固定。
	if (a[left] < a[mid])
	{
		if (a[mid] < a[right])
			return mid;
		else if (a[right] < a[left])
		{
			return left;
		}
		else return right;
	}
	else
	{
		if (a[mid] > a[right])
			return mid;
		else if (a[left] < a[right])
			return left;
		else return right;
	}

}

这样,这道题就可以用快排的方法提交了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud入门实战(十五)分布式事务框架Seata简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

前端基础3——JavaScript基础用法

文章目录 一、基本使用1.1 内部方式1.2 外部导入方式1.3 css标签调用js脚本&#xff08;触发事件&#xff09; 二、Windows对象2.1 对象属性2.2 对象方法 三、数据类型3.1 字符串处理3.2 数组处理3.3 对象处理 四、流程控制4.1 操作符4.2 if判断语句4.3 for循环语句4.4 continu…

基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析 准备说明配置过滤解密分析 准备 1&#xff09;nRF52840 Dongle 2&#xff09;Mesh节点 3&#xff09;手机作为配网器&#xff08;苹果手机安装nRF Mesh APP&#xff09; 说明 1&#xff09;节点使用的例程目录&#xff1a;nrf5sdkformeshv500src\examples\…

手机录屏方法推荐,3种方法带你玩转

随着智能手机的普及&#xff0c;录制手机屏幕已经成为我们在日常生活中和工作中经常需要进行的操作。有时候&#xff0c;我们想录制一段手机游戏的精彩瞬间或者与朋友分享手机操作的技巧。因此&#xff0c;找到一种方便、简单的手机录屏方法变得尤为重要。本文将介绍手机录屏的…

【IEEE会议】第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)

第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023) 2023 5th International Conference on Frontiers Technology of Information and Computer 第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)将在中国青岛举行&#xff0c; 会期是2023年11月17-19日&#xff0c;…

(已解决)ModuleNotFoundError: No module named ‘braceexpand‘

问题描述 import braceexpand, yaml ModuleNotFoundError: No module named braceexpand 解决办法 pip install braceexpand 参考链接https://www.roseindia.net/answers/viewqa/pythonquestions/52026-ModuleNotFoundError-No-module-named-braceexpand.html 其他问题-1 im…

安全狗陈奋:数据安全需要建立在传统网络安全基础之上

8月22日-23日&#xff0c;由创业邦主办的“2023 DEMO WORLD 企业开放式创新大会”在上海顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c;致力…

钢筋水泥中的信仰--爱摸鱼的美工(16)

好久没有更新了&#xff0c;爱摸鱼的美工摸鱼太久可&#xff0c;终于出了一起钢筋水泥中的信仰&#xff0c;希望人们更加坚定个人的信仰。

Pandas 2.1发布了

2023年3月1日&#xff0c;Pandas 发布了2.0版本。6个月后&#xff08;8月30日&#xff09;&#xff0c;更新了新的2.1版。让我们看看他有什么重要的更新。 更好的PyArrow支持 PyArrow是在Panda 2.0中新加入的后端&#xff0c;对于大数据来说提供了优于NumPy的性能。Pandas 2.1…

【RabbitMQ】服务启动成功,无法访问localhost:15672(RabbitMQ Management)

问题描述 RabbitMQ 服务已经启动成功&#xff0c;已经安装rabbitmq_management插件&#xff0c;无法访问RabbitMQ Management&#xff08;http://localhost:15672/&#xff09;。 原因分析 15672端口被Microsoft Edge占用。 解决方案 打开cmd终端&#xff0c;输入指令&#…

超声波气象站的功能和作用

超声波气象站是一种先进的测量气象要素的设备&#xff0c;其功能和作用在许多领域中都得到了广泛的应用。下面将从功能和作用两个方面来详细介绍超声波气象站。 一、超声波气象站的功能 ①测量各种气象要素 超声波气象站可以测量多种气象要素&#xff0c;包括温度、湿度、气…

Spark 环境安装与案例演示

Spark 环境安装 一、准备工作 1、hadoop成功安装 2、防火墙关闭 二、解压安装 1、上传 spark 安装包到/tools 目录&#xff0c;进入 tools 下&#xff0c;执行如下命令&#xff1a; tar -zxvf spark-2.1.0-bin-hadoop2.7.tgz -C /training/由于 Spark 的脚本命令和 Hadoop…

【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据

目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网&#xff08;重点&#xff09; 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置大量请求头随机使用 2.4、登录豆瓣网 三、爬取某一部热门电影…

Redis 7 第四讲 数据持久化

总体 RDB 介绍 RDB 持久化以指定的时间间隔执行数据集的时间点快照 。 把某一时刻的数据和状态以文件的形式写到磁盘上,即使出现故障宕机,快照文件也不会丢失,数据的可靠性得到保证。快照文件就是RDB(Redis DataBase)文件(dump.rdb) 作用 在指定的时间间隔内将内存中的数…

Redis的缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&…

VB:数值交换

VB&#xff1a;数值交换 Private Sub Command1_Click()Dim a%, b%a 5b 7Call mySwap(a, b)Print "a"; aPrint "b"; b End Sub ByRef 关键字允许子程序直接修改传递的参数的值&#xff0c;而不仅仅是拷贝一份副本&#xff0c;这样可以实现更灵活的数据处…

ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图

文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块&#xff0c;指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…

9.物联网LWIP,ip数据报,udp数据报,tcp数据报

一。ip协议原理&#xff08;网络层&#xff09; 1.网络地址转换NAT 我们上网是通过运营商向我们提供的IP地址来上网的&#xff0c;并不是自身的IP地址&#xff0c;所以这就需要网络地址转换NAT的帮助。即内网访问外网所需要的ip转换装置。 2.ip数据报 &#xff08;1&#xff…

延长Flash存储器使用寿命的研究

发布时间&#xff1a;2009年12月15日   引 言 随着嵌入式系统在数码相机、数字摄像机、移动电话、MP3音乐播放器等移动设备中越来越广泛的应用&#xff0c;Flash存储器已经逐步取代其他半导体存储元件&#xff0c;成为嵌入式系统中主要数据和程序载体。Flash存储器又称闪存&…

黑马最新MybatisPlus教程!帮你实现快速开发

天下武功&#xff0c;唯快不破。在互联网世界中&#xff0c;更甚。产品更新要快、迭代要快、开发速度那必须得快。 在追求“快”的这条路上&#xff0c;大佬们都会使用上好的开发工具&#xff0c;来帮助自己实现高效开发&#xff0c;其中MybatisPlus便是提速的重要角色。 我们…