当前位置: 首页 > news >正文

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

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

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;}}

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

相关文章:

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

快排排序是非常快的&#xff0c;但是有一种情况快排是无法进行的。 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 这道题看上去没什么问题&#xff0c;但是如果我们用快排去提交的话&#xff0c;发现快排其实是被针对了的。 有一个样例是这样的。如果我们按照快排的…...

设计模式-迭代器

文章目录 1. 引言1.1 概述1.2 设计模式1.3 迭代器模式的应用场景1.4 迭代器模式的作用 2. 基本概念2.1 迭代器 Iterator2.2 聚合 Aggregate2.3 具体聚合 ConcreteAggregate 3. Java 实现迭代器模式3.1 Java 集合框架3.2 Java 迭代器接口3.3 Java 迭代器模式实现示例 4. 迭代器模…...

Hive学习(12)Hive常用日期函数

1、hive返回当天三种方式 select current_date; --返回年月日 --2017-06-15 select current_timestamp; --返回年月日时分秒 --2017-06-15 19:54:44 SELECT from_unixtime(unix_timestamp()); --2017-06-15 19:55:042、from_unixtime&#xff1a;转化unix时间戳到当前时区的时…...

PowerQuery动态加载M公式

Power Query 是Excel中的强大数据处理与转换工具&#xff0c;如果需要“动态”处理数据&#xff0c;大家第一时间想到的是可以使用VBA&#xff0c;利用代码创建M公式&#xff0c;进而创建PQ查询&#xff0c;但是复杂的M公式可能有很多行&#xff0c; 使用VBA处理起来并不是很方…...

2分钟搭建FastGPT训练企业知识库AI助理(Docker部署)

我们使用宝塔面板来进行搭建&#xff0c;更方便快捷灵活&#xff0c;争取操作时间只需两分钟 宝塔面板下安装Docker 在【软件商店中】安装【docker管理器】【docker模块】即可 通过Docker安装FastGPT 通过【Docker】【添加容器】【容器编排】创建里新增docker-compose.yaml以下…...

TDengine函数大全-字符串函数

以下内容来自 TDengine 官方文档 及 GitHub 内容 。 以下所有示例基于 TDengine 3.1.0.3 TDengine函数大全 1.数学函数 2.字符串函数 3.转换函数 4.时间和日期函数 5.聚合函数 6.选择函数 7.时序数据库特有函数 8.系统函数 字符串函数 TDengine函数大全CHAR_LENGTHCONCATCONCA…...

part-02 C++知识总结(类型转换)

一.C常用的类型转换函数 在C中&#xff0c;有几种自带的类型转换函数可以用于不同类型之间的转换。以下是其中一些常用的自带类型转换函数&#xff1a; 1.隐式转换&#xff08;Implicit Conversion&#xff09; 数字类型之间的隐式转换&#xff0c;例如将int转换为float、do…...

stable diffusion实践操作-图生图

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文...

Jtti:Ubuntu18.04如何修改远程ssh端口号

要在Ubuntu 18.04上修改SSH的远程端口号&#xff0c;您需要编辑SSH服务器配置文件并指定新的端口号。以下是具体的步骤&#xff1a; 以root或具有sudo权限的用户登录到您的Ubuntu服务器。 备份SSH配置文件&#xff08;可选&#xff09;&#xff1a; 在进行任何更改之前&…...

微软表示Visual Studio的IDE即日起开启“退休”倒计时

据了解&#xff0c;日前有消息透露称&#xff0c;适用于 Mac平台的Visual Studio集成开发环境(IDE)于8月31日启动“退休”进程。 而这意味着Visual Studio for Mac 17.6将继续支持12个月&#xff0c;一直到2024年8月31日。    微软表示后续不再为Visual Studio for Mac开发…...

好马配好鞍:Linux Kernel 4.12 正式发布

Linus Torvalds 在内核邮件列表上宣布释出 Linux 4.12&#xff0c;Linux 4.12 的主要特性包括&#xff1a; BFQ 和 Kyber block I/O 调度器&#xff0c;livepatch 改用混合一致性模型&#xff0c;信任的执行环境框架&#xff0c;epoll 加入 busy poll 支持等等&#xff0c;其它…...

element——switch接口成功后赋值打开开关

应用场景 基本用法使用v-model双向绑定值&#xff0c;进行开关控制 例子1:需求&#xff1a; **点击switch&#xff0c;出弹窗&#xff0c;点击弹窗保存按钮调接口成功后再赋值&#xff08;row.orderButtonValue“1”&#xff09;打开switch开的状态变颜色。 在vue 中使用 :va…...

WPF Border设置渐变色

背景色渐变 <Border> <Border.Resources> <Style TargetType"Border"> <Setter Property"Background"> …...

SAP_ABAP_OLE_EXCEL批导案例

SAP ABAP顾问能力模型梳理_企业数字化建设者的博客-CSDN博客SAP Abap顾问能力模型https://blog.csdn.net/java_zhong1990/article/details/132469977 一、OLE_EXCEL批导 1.1 下载按钮 1.2 选择EXCEL上传&#xff0c;解析EXCLE数据&#xff0c; Call屏幕。 1.3 实现效果 1.4…...

MySQL以及版本介绍

一、MySQL的介绍 MySQL数据库管理系统由瑞典的DataKonsultAB公司研发&#xff0c;该公司被Sun公司收购&#xff0c;现在Sun公司又被Oracle公司收购&#xff0c;因此MySQL目前属于 Oracle 旗下产品。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用…...

stm32 iap sd卡升级

参考&#xff1a;STM32F4 IAP 跳转 APP问题_stm32程序跳转_古城码农的博客-CSDN博客 app程序改两个位置 1.程序首地址&#xff1a; 2.改中断向量表位移&#xff0c;偏移量和上面一样就可以 然后编译成bin文件就可以了...

D358周赛复盘:哈希表模拟⭐⭐+链表乘法翻倍运算(先反转)⭐⭐⭐

文章目录 2815.数组中的最大数对和思路完整版 2816.翻倍以链表形式表示的数字&#xff08;先反转&#xff0c;再处理进位&#xff09;思路完整版 补充&#xff1a;206.反转链表&#xff08;双指针法&#xff09;完整版 2817.限制条件下元素之间的最小绝对差&#xff08;cpp不知…...

java八股文面试[数据库]——索引的基本原理、设计原则

索引的设计原则 索引覆盖是什么&#xff1a; 索引&#xff08;在MySQL中也叫做“键&#xff08;key&#xff09;”&#xff09; 是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时&#xff0c;索引…...

2023年京东方便食品行业数据分析(京东数据报告)

​疫情中方便食品的销售一度火爆&#xff0c;但随着当前消费场景的开放&#xff0c;方便食品销售又恢复常态并开始下滑。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份&#xff0c;京东平台方便食品的销量为800万&#xff0c;环比降低约23%&#xff0c;同比降…...

无涯教程-Android - Style Demo Example函数

下面的示例演示如何将样式用于单个元素。让我们开始按照以下步骤创建一个简单的Android应用程序- 步骤说明 1 您将使用Android Studio IDE创建一个Android应用程序,并在 com.example.saira_000.myapplication 包下将其命名为 myapplication ,如中所述您好世界Example一章。 2 …...

AI插件深度对比 | Copilot、Tabnine、Codeium谁是王者

Copilot 的代码补全能力确实厉害&#xff0c;我试过在写 Python 函数的时候&#xff0c;只要输入注释&#xff0c;它就能自动生成函数体。比如写 “# 计算斐波那契数列”&#xff0c;它能直接给出递归和迭代两种实现方式。不过有时候生成的代码有点冗长&#xff0c;需要手动精简…...

核控卡件综合测试平台

1&#xff09;系统简介核控卡件综合测试平台具备DI、DO、AI、AO四类IO信号的采集/输出功能以及串口、网口的通信功能&#xff0c;主要用于对综合测试平台及样机的功能测试提供支撑。综合测试平台集成测试设备的对外总线接口&#xff0c;主要包括RS422、以太网、AI、AO、DI、DO等…...

手把手教你用BES AUDIO_DUMP抓取蓝牙耳机通话AEC前后音频(附AU播放教程)

蓝牙耳机AEC算法调试实战&#xff1a;从数据抓取到效果验证全流程 在嵌入式音频开发领域&#xff0c;通话降噪&#xff08;AEC&#xff09;算法的效果验证一直是工程师面临的痛点。传统调试方法往往依赖主观听感或简单波形对比&#xff0c;难以精准定位问题。本文将基于BES2500…...

【DeepSeek API接入实战指南】:20年AI架构师亲授5大避坑要点与3分钟快速调通秘籍

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek API接入实战指南概览 DeepSeek API 提供了高性能、低延迟的大模型推理能力&#xff0c;支持文本生成、函数调用、流式响应等多种交互模式。本章聚焦于从零开始完成 API 接入的核心路径&#xff0c;涵…...

别再只会点灯了!用Arduino和WS2812B灯带做个会呼吸的桌面氛围灯(附完整代码)

用Arduino打造会呼吸的WS2812B智能氛围灯系统 你是否已经厌倦了简单的LED闪烁效果&#xff1f;想让你的工作台或游戏空间拥有更高级的光效体验&#xff1f;今天我们将突破基础点灯的局限&#xff0c;用Arduino和WS2812B灯带打造一套具备呼吸效果的智能氛围灯系统。这不仅仅是一…...

AD9361配置避坑指南:从UART调试到FLASH固化的全流程实战(Verilog源码分析)

AD9361纯逻辑配置实战&#xff1a;从UART调试到FLASH固化的工程化解决方案 在无线通信系统开发中&#xff0c;AD9361作为一款高度集成的射频收发器&#xff0c;其配置方式直接关系到项目开发效率。对于需要脱离处理器依赖、追求极致实时性的场景&#xff0c;纯FPGA逻辑(PL)配置…...

番茄小说下载器:打造个人数字书库的终极解决方案

番茄小说下载器&#xff1a;打造个人数字书库的终极解决方案 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在数字阅读时代&#xff0c;你是否曾因网络不稳定而中断阅读&#xff1f;是否想…...

Python 浅拷贝与深拷贝:为什么我改了 b,a 也跟着变了?

Python 浅拷贝与深拷贝&#xff1a;为什么我改了 b&#xff0c;a 也跟着变了&#xff1f; 在 Python 中&#xff0c;列表、字典、集合这类对象都属于可变对象。 也正因为它们“可变”&#xff0c;所以在复制数据时&#xff0c;经常会遇到一个非常经典的问题&#xff1a;明明我改…...

Obsidian 完整使用手册 — 目录与索引

Obsidian 完整使用手册 — 目录与索引 一份从入门到精通的 Obsidian 全面指南&#xff0c;涵盖基础操作、核心功能、插件生态、同步备份与进阶技巧。 手册列表 编号手册名称内容概要01基础入门篇软件安装、界面布局、库管理、核心设置02Markdown 语法篇格式化语法、扩展语法、…...

Perplexity计算原理与业务落地脱节?——资深算法架构师亲授7步校准法,避免模型上线翻车

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity的本质定义与数学直觉 Perplexity&#xff08;困惑度&#xff09;是衡量概率模型对未知序列预测能力的核心指标&#xff0c;其本质是交叉熵的指数形式&#xff0c;直观反映了模型在面对真实数据时的…...