[C语言实现]快速排序O(n²)——处理有序及相同序列优化

快速排序的优化2: 解决所有数据相同时的退化问题,C语言实现 上一节优化解决了数据有序的情况下,快速排序退化成冒泡排序的问题,但仍然不能解决所有数据都一样大的情况下算法退化的问题。其实这个问题很容易解决,我们只需要让虫虫和东东轮流移动即可,这样还能确保两个小朋友每次都在数组中间相遇,使数组分成均匀的两段。 那么,怎样才能让两个小朋友轮流移动呢?很简单,设定一个变量flag,flag == 0时,让东东先动,flag == 1时,让虫虫先动就可以啦。这个思想很简单,但实现起来需要一点点技巧。下面是代码: void quickSort(int arr[], int low 阅读详情


🥰作者: FlashRider

🌏专栏: 初阶数据结构

🍖知识概要:快速排序在某些特定情况下时间复杂度会降为O(n²),我们就来探讨一下在这些情况下如何优化快速排序的时间复杂度。

目录

有序序列——取中为key

相同序列——三路划分

综合优化——最优美的快排


有序序列——取中为key

 对于有序的序列,快速排序每一趟如果选最左端点为key,那么排完一趟后比key小的数为0个,所以会浪费很多性能,而且这样选n次key,那么时间复杂度就会降低为n²。

对于有序序列的优化就是,我们可以将mid取为key,不要每次选最大或最小的为key即可。

//取key方式1 直取mid
int key = left + right >> 1;//等价于(left + right)/2
//取key方式2 三数取中
int get_key(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;
		}
		else
		{
			return left;
		}
	}
	else // a[left] > a[mid]
	{
		if (a[mid] > a[right])
		{
			return mid;
		}
		else if (a[left] > a[right])
		{
			return right;
		}
		else
		{
			return left;
		}
	}
}
int key = get_key(a, left, right);

相同序列——三路划分

Left Right Current 三个指针。

取left为key 则cur == key cur++。

cur < key 与left交换且cur++ left++ cur>key 与right交换且right-- cur不++ (因为要使得left永远指向与key相等的值)

cur 与 right 过之交臂(cur > right)时结束,此时left和right在等于key区间的左右端点处。

最终呈现 小于key 等于key 大于key 的三个区间。

left左边为左区间 right右边为右区间

void QuickSort(int* a, int begin, int end)
{
    if(begin >= end) return;    
	int left = begin, right = end;
    int cur = begin + 1;
    int key = get_key();//详见三数取中
    while(cur < right)
    {
        if(a[cur] == key) cur++;
        else if(a[cur] < key) swap(a[cur++], a[left++]);
        else swap(a[cur], a[right--]);
    }
    QuickSort(a, begin, left);
    QuickSort(a, right, end);
}

综合优化——最优美的快排

void sort(int q[], int l, int r)//需要考虑边界问题 
//(没有用key作下标, 递归用的i和j,需要考虑key本身位置)
{
	if(l >= r) return;
	int x = q[l];
	int i = l - 1, j = r + 1;
	while(i < j)
	{
		do i++; while(q[i] < x);
		do j--; while(q[j] > x);
		if(i < j)
			swap(q[i], q[j]);
	}
	sort(q, l, j), sort(q, j + 1, r);
}

快速排序的优化1: 选取中间值或随机值作为基准,C语言实现 我们考虑一个问题。如果要排序的数组本身就是有序的,例如:1, 2, 3, 4, 5。用上面的方法排序会发生什么情况? 基准数是1,东东从右边开始往左边走,结果一直走到最左边,遇到了虫虫才停止,这个过程中,虫虫根本没有机会移动。也就是说这个基准数本来就在正确的位置。这时这个数组只能被分为两部分,而不是希望的三部分。除了基准数之外,剩下的一部分仅仅比原数组少了一个元素。而这个过程的时间复杂度为O(N),接下去继续,结果发现每次得到的新数组都仅仅比原先少一个元素,所以一共需要进行N次。这个过程与冒泡排序的运行过程 阅读详情

相关推荐

快速排序的优化4: 双基准三路快速排序,C语言实现

在堆排序 (见本章第三节) 的改进中,我们发现如果把标准的二叉堆改成三叉堆、四叉堆可以提高堆的效率。特别是四叉堆是所有堆中效率最高的堆。改进的思路:增加子节点的个数,可以降低堆的高度,所以可以提高堆的效率。同样的,如果快速排序可以把数组分成三段,同样可以减少划分的次数,提高算法的效率。 我们对快速排序算法进行改进:分别选取数组两端的元素作为基准 (要求standard1 ≤ standard2),把 ≤ standard1的数放在数组最左边,把 ≥ standard2的数放在最右边,把介于两个基准数之间的数

wangeil007的博客 778

快速排序—C语言实现

🥰在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方法,下面我们来看一看传说中的快速排序的特点与效率怎么样。😍1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定。

Yawesh的博客 1451

【C语言】深入理解快速排序算法

本文将详细讲解快速排序算法的原理、实现以及优化方法,帮助读者深入理解并掌握这一经典的排序算法。

qq_40205510的博客 762

快速排序(递归)——C语言实现

一、快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 二、快速排序之“挖坑法” 挖坑法思路: 单趟排序:单趟排序的目的就是使当前的key值放到它最终的位置,左边全是比它小的数,右边全是比它大的数。我们一般选取第一个值或者最后一个值做key值,最开始pivot就

qq_41890240的博客 6786

【C语言】switch语句 输出成绩判断成绩档次 (基础 需多次回看 加深记忆)| C语言面试:C语言中的冒泡排序和快速排序有何区别?请给出它们的时间复杂度分析。

案例 输入一个成绩,判断属于以下哪个档次: 大于等于90:A 80到89:B 70到79:C 60到69:D 小于60:E 代码如下: //输入一个成绩,判断属于以下哪个档次 #include <stdio.h> int main() { double score; printf("请输入成绩:"); scanf("%lf",&score); while(score>100||score<0){ printf("您的输入有误,请重新输入0到100的整数\n");

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1万+

通过C语言实现三种版本的快速排序

快速排序是一种高效的排序算法,通过选取一个“基准”元素,将数组分为两部分:比基准小的元素和比基准大的元素,然后递归地对这两部分进行排序,从而实现对整个数组的排序。该算法平均时间复杂度为O(nlogn),最坏情况下为O(n²),但由于实际应用中很少出现最坏情况,因此快速排序仍然是一种广泛使用的排序算法。快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。

qq_74013365的博客 2374

为什么你的快排总是O(n²)?三数取中法拯救你的C语言代码

掌握C语言实现快速排序的三数取中法,有效避免快排退化为O(n²)。适用于大规模无序数据场景,通过选取基准点优化分区效率,显著提升性能。方法简单高效,值得收藏。

LogicNest的博客 711

DPARSF高级版 vs 基础版怎么选?没有T1数据也能做fMRI分析吗?

本文深度对比了DPARSF高级版与基础版在fMRI分析中的核心差异与适用场景,特别针对无T1数据的情况提供了实战解决方案。高级版依赖T1像实现高精度配准,适合需要精确解剖定位的研究;基础版则无需T1数据,适用于功能连接等相对空间要求不高的分析。文章还提供了版本选择决策树和常见问题解决方案,帮助研究者根据实际需求做出最优选择。

weixin_42526087的博客 132

快速排序算法详细教程及其优化,C语言代码

快速算法 简介: 快速排序是基于分治技术的重要排序算法,排序算法按照元素的值对它们进行划分。 划分是对给定数组中的元素的重新排序,使得A[s]A[s]A[s]左边的元素都小于等于A[s]A[s]A[s],而右边A[s]A[s]A[s]右边的元素都大于等于A[s]A[s]A[s]。 显然,建立了一个划分以后,A[s]A[s]A[s]已经位于它在有序数组中的最终结果,接下来我们可以继续对A[s]A[...

Rp的博客 1万+

避开这些坑!baostock获取股票数据时最容易犯的5个错误(Python实战)

本文针对使用Python和baostock库获取股票历史数据时常见的五大陷阱,提供了实战解决方案。重点剖析了登录状态验证、参数配置、数据解析、批量操作效率及数据一致性校验等关键环节,帮助开发者构建稳健高效的数据获取流程,避免因细节疏忽导致的数据错误或性能瓶颈。

websocket5live的博客 1440

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1338

C语言实现快速排序(附带源码)

C语言实现快速排序(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1378

WPS文档中心和文档中台 operate 未授权访问漏洞(CVE-2025-0717)

WPS文档中心和文档中台的/open/v6/api/etcd/operate?key=/config/storage&method=get接口存在未授权访问漏洞,攻击者可通过该漏洞获取AK/SK密钥等信息,这些密钥通常用于系统内部认证和权限控制,泄露后可能导致攻击者进一步修改K8s配置、部署恶意容器或执行远程命令,最终实现对系统的完全控制。

李同學AI安全 903

【C语言 - 数据结构】万字详解快速排序、归并排序

你是我黄昏时买到一束花的快乐!1、hoare版本 2、挖坑法3、前后指针法 有了前面的讲解,我们对于hoare版本的快速排序已经有了一定的了解了,我们现在实现其代码部分:(大家可以先理解我对hoare版本的定义再来看其实现代码,或者是结合起来理解) 贴一张图方便大家理解 2.3前后指针法的递归代码示例 三、快速排序的非递归实现以及快排模板 3.1快排的非递归实现 我们还是使用前后指针法来找key,然后用栈来实现递归的作用 用前后指针加之栈来实现快排的代码:

qq_62662919的博客 5513

ElectrolyteGPT:首个电池电解液逆向设计的生成式 AI 系统 —— 算法原理与复现解析

数据驱动的重要性:1100 万→100 万的精心筛选,比单纯增大模型更有效领域适配:fLine 表示法、正则分词、化学感知的数据增强(SMILES randomization)都是关键小模型的力量:6M 参数在特定化学空间的表现,远超通用大模型在相同任务上的零样本能力条件生成的极限:10 维条件导致模型崩溃,提示我们需要更好的条件编码策略(如 diffusion guidance、RLHF-style 偏好优化)未来方向配方实验验证。

ASKCOS博客 123

使用 MATLAB/Simulink 构建一个 基于神经网络控制的单相并网逆变器系统

单相并网逆变器广泛应用于户用光伏小型储能和电动汽车V2G等场景。其核心控制目标是实现高质量的并网电流,即电流与电网电压同频同相(单位功率因数),且总谐波畸变率 (THD)极低。非线性因素:电力电子器件的开关死区非线性电感寄生参数。参数不确定性:滤波器元件(L, C)的老化温漂。电网扰动:电压谐波频率波动不平衡。模型依赖性:PI、PR等控制依赖于精确的系统模型,模型失配导致性能下降。动态响应:在光照突变(光伏)或负载突变(储能)下,需快速、无超调地响应。

xiaoheshang_123的博客 274

C语言入门(快速排序之三路划分)

三路划分快速排序是针对含大量重复元素数组的高效排序算法。相比传统快速排序将数组分为两部分,三路划分通过lt、i、gt三个指针将数组分为小于、等于和大于基准值的三个区域。这种方法能一次性处理所有重复元素,避免重复比较和交换,使平均时间复杂度稳定在O(nlogn),有效解决了传统快排处理重复元素时性能退化的问题。算法实现时通过一次遍历完成三路划分,仅需递归处理两侧区域,特别适合成绩、年龄等重复数据较多的排序场景,是工程实践中常用的优化方案。

nplplus的博客 7195

基于STM32F1XX 、HAL库的BH1745NUC-E2环境光传感器驱动应用C语言程序设计

printf("BH1745制造商ID: 0x%02X\r\n", BH1745_ReadManufacturerID(&hbh1745));#define BH1745_ADDR_HIGH 0x39 // ADDR引脚接VDD。#define BH1745_ADDR_LOW 0x38 // ADDR引脚接地。= 0xE0) // BH1745制造商ID为0xE0。// 清除RGBC测量使能位。printf("BH1745初始化失败\r\n");

PP_Cottage的博客 278

排序算法:快速排序——C/C++

快速排序详细介绍——C++一.算法介绍二.算法思路三.代码实现 一.算法介绍 快速排序几乎是目前所有排序法中速度最快的方法,STL的sort()函数就是基于快速排序的优化。 时间复杂度 O 最好 O( nlog⁡2nn\log_2nnlog2​n) 最坏(出现几率极小) O(n2n^2n2) 平均 O(nlog⁡2nn\log_2nnlog2​n) 空间复杂度 O(log⁡2n\log_2nlog2​n) 二.算法思路 1.确定一个分界点,将序列分为左右两部

Tiany的博客 7748

Isaac Lab & GR00T N1 入门教程(七)人形机器人推理与技能学习策略基准测试

本文介绍了IsaacLab设计的工业机器人操作评估系统,包含两项任务:螺母倾倒(成功率91%)和排气管分拣(成功率95%)。系统支持通过IsaacGR00TN1模型进行策略闭环评估,提供完整的开发环境配置指南(需Ubuntu22.04、CUDA12.8等环境),数据集下载方式(HuggingFace平台托管),以及模型微调流程。评估支持并行化测试(建议10-30个并行环境),并给出详细硬件配置建议(推荐RTX A6000 Ada显卡)。文档还包含常见问题解决方案,特别说明当前暂不支持Blackwell GP

2506_90492529的博客 1118

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【排序】快速排序(C语言实现)

任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。Hoare思想挖坑法前后指针法三路划分以及快速排序的一些小优化,和递归与非递归的实现方式。阅读本章建议有一点二叉树的基础,如果对二叉树不太了解的可以看看:《初阶二叉树》这篇文章快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)

weixin_73914025的博客 1575

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C语言】八大排序算法

整合了常见的八种排序算法,详细讲述以及用大量的图讲解了各种算法的实现步骤

zcxyywd的博客 4658

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构-排序算法(c语言实现篇)

数据结构中最全的排序算法(C语言实现)

CHAKMING1的博客 1万+

快速排序 c语言代码实现

快速排序 快速排序,顾名思义,是一种排序速度非常快的排序方法,该算法之所以非常快,是因为高度优化的内部循环,该算法在实际应用中非常广泛。 快速排序是一种采用分治思想,在实践中通常运行较快一种排序算法   代码实现c语言版   #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define N 7 //函数dayin:打印数组...

軒轅劍的博客 1万+

三数取中法究竟强在哪?一文看懂C语言快速排序性能瓶颈破解

掌握C语言实现快速排序的三数取中法,有效解决传统快排在有序数据下的性能瓶颈。通过选取首、中、尾三数的中位数作为基准,提升分治效率,降低最坏情况概率,适用于大规模随机数据排序。算法稳定且高效,值得收藏。

VarFlow的博客 936

【20年C语言专家经验分享】:三数取中法让快排稳定进入O(n log n)

掌握C语言实现快速排序的三数取中法,有效避免快排最坏情况,提升算法稳定性。适用于大规模无序数组排序,通过选取基准值优化分区效率,确保接近O(n log n)性能表现,值得收藏。

DeepLens的博客 917
上一篇: [C语言实现]快排归并非递归以及八大排序时空稳定性分析
FlashRider
博客等级 码龄4年 529粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值