排序 - 快速排序

起泡排序&快速排序 起泡排序和快速排序都属于交换排序,时间复杂度均为O(n^2),其中心思想是各数据之间的比较,然后交换其位置,以实现有序的操作。所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。——百度百科一.起泡排序又称冒泡排序,是一种常见的排序方法。名字就反应了他的思想--冒泡,关键字值大像石头一样往... 阅读详情

快速排序是在实践中最快的已知排序算法,它的平均运行时间是O(NlogN)。该算法之所以特别快,是由于非常精炼和高度优化的内部循环。它的最坏情形性能为O(N2)。快速排序是一种分治的递归算法。将数组S排序的基本算法由下列简单的四步组成:
1.如果S中元素个数为0或1,则返回
2.取S中任一元素v,称之为枢纽元(pivot)
3.将S - {v} (S中其余元素)分成2个不相交集合:S1 = {x ∈ S - {v} | x <= v } 和 S2 = {x ∈ S - {v} | x >= v }
4.对S1、S2执行上面步骤1、2、3

S1、S2的平衡将决定快速排序算法的性能,第2步枢纽元的选取对S1、S2的平衡取关键作用。选取枢纽元错误的做法就是将第一个元素作为枢纽元。如果输入是随机的,那么这是可接受的,但如果输入时预排序或反序的,那么选取第一个元素作为枢纽元将产生一个劣质的分割,因为所有的元素要么被划入S1,要么被划入S2。这种情况甚至可能发生在所有递归调用中。实际上如果输入是预先排序的这种快速排序花费的时间将是二次方的。

选取枢纽元的方法:
1. 随机选取枢纽元,代价昂贵。
2. 三值中值分割法,取序列中(left + right) / 2处元素的值作为枢纽元。

三值中值分割法实现快速排序的算法如下:

#include <stdio.h>
#define CUTOFF 3

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

/*三值中值分割法求枢纽元*/
int median3(int array[], int left, int right)
{
    int mid = left + (right - left) / 2;
    if (array[mid] < array[left])
        swap(&array[mid], &array[left]);
    if (array[left] > array[right])
        swap(&array[left], &array[right]);
    if (array[mid] > array[right])
        swap(&array[mid], &array[right]);
    swap(&array[mid], &array[right - 1]); /*Hide pivot*/
    return array[right - 1]; /*Return pivot*/
}

/*插入排序*/
void insert_sort(int array[], int left, int right)
{
    int i, j, tmp;
    for (i = left + 1; i <= right; i++) {
        tmp = array[i];
        for (j = i; j > 0 && array[j - 1] > tmp; j--)
            array[j] = array[j - 1];
        array[j] = tmp;
    }   
}

void qsort(int array[], int left, int right)
{
    int i, j, mid, pivot;

    if (right - left >= CUTOFF) {
        mid = left + (right - left) / 2;
        pivot = median3(array, left, right);
        i = left;
        j = right - 1;

        for (;;) {  
            while (array[++i] < pivot);
            while (array[--j] > pivot);
            if (i < j)
                swap(&array[i], &array[j]);
            else
                break;
        }

        swap(&array[i], &array[right - 1]);/*Restore pivot*/
        qsort(array, left, i - 1);
        qsort(array, i + 1, right);
    } else
        insert_sort(array, left, right);
}


int main()
{
    int array[] = {7, 6, 5, 1, 3, 2, 4};
    qsort(array, 0, 6);
    return 0;
}
Cortex-M TrustZone实战:从硬件隔离到安全交互的嵌入式开发指南 在嵌入式系统开发中,硬件安全隔离是构建可信执行环境(TEE)的核心技术。其原理是通过处理器硬件机制,将系统资源划分为安全与非安全域,实现内存、外设和代码的强制访问控制。这项技术的核心价值在于,它能在单一芯片上为资源受限的物联网(IoT)设备、智能传感器等提供芯片级的安全基础,无需依赖外置安全元件,从而降低BOM成本并简化设计。典型的应用场景包括保护设备密钥、实现安全启动、构建安全服务(如加密、密钥管理)以供应用程序调用。本文聚焦于Arm Cortex-M系列微控制器上的TrustZone技术实现,针对开发中 阅读详情

相关推荐

Hcaptcha验证码的‘免浏览器’破解思路:协议分析与N值算法逆向

本文深入解析Hcaptcha验证码的‘免浏览器’破解思路,通过协议分析与N值算法逆向,实现高效自动识别。文章详细拆解Hcaptcha的API交互流程,揭示关键参数`req`和`n`的生成机制,并提供轻量级实现方案,显著降低资源消耗,适用于大规模数据采集等场景。

weixin_30838873的博客 535

快速排序(降序)

#include&lt;iostream&gt; #include&lt;algorithm&gt; using namespace std; const int N=100; int buf[N+5]; bool cmp(int x,int y) {     return x&gt;y; } int main() {     int n;     while(scanf("%d",&amp;n)...

amf12345的博客 2324

Jetson nano/nx使用麒麟arm版向日葵实现远程控制

Jetson nano/nx使用麒麟arm版向日葵实现远程控制1、安装向日葵软件2、运行Sunlogin Client3、向日葵闪退问题4、重启系统5、重启后黑屏问题 特别提醒: 本博客的第3步切换桌面管理环境到lightdm,存在重启后开机黑屏的风险,我在自己的nano/nx上都没有问题,但帮一个同学的nx配置时,切换到lightdm,重启开机却出现了黑屏,所以执行第3步的话要有心理准备,黑屏解决方法见第5步,特此提醒。

胡乱学点东西 2万+

十大经典排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序)

例如对于含有 n 个记录的无序表,首先默认表中每个记录各为一个有序表(只不过表的长度都为 1),然后进行两两合并,使 n 个有序表变为 ⌈n/2⌉ 个长度为 2 或者 1 的有序表(例如 4 个小有序表合并为 2 个大的有序表),通过不断地进行两两合并,直到得到一个长度为 n 的有序表为止。这种归并排序方法称为:2-路归并排序。本节介绍一种不同于插入排序和选择排序的排序方法——归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。.....

weixin_59803490的博客 1969

别再买错磁铁了!手把手教你为TLE5012B/AS5047等磁编码器选配和安装径向充磁磁铁

本文详细解析了为TLE5012B/AS5047等磁编码器选配和安装径向充磁磁铁的关键要点。从充磁方向的物理本质到供应商沟通技巧,再到安装工艺的黄金法则,帮助工程师避免常见错误,确保磁编码器稳定工作。特别强调了径向充磁的重要性及验证方法,并提供了尺寸选择、温度特性和抗干扰设计的实用建议。

weixin_26750481的博客 315

STC15单片机实战项目软件开发第四讲 - 按键检测(状态机)

软件开发第四讲 - 按键检测(状态机) 一、工具链接 1、Keil c51 UV4 https://yunpan.360.cn/surl_yrIfYYmeRFk 2、STC-ISP下载软件 https://yunpan.360.cn/surl_yxH4CuUUvI3 二、学习板获取方式 方法1:自己设计PCB,自行打板焊接; 方法2:用群主设计的PCB,自行打板焊接; 方法3:向群主购买,淘宝链接...

硬件家园 3045

【排序】快速排序

快速排序

喜欢你,像风走了八千里 不问归期 3009

基于COMSOL电弧动态仿真模型优化:高收敛性可修改吹弧方案解析

在多物理场耦合分析中,电弧动态仿真历来是数值稳定性的难点:温度从室温跃升至数万开尔文,电导率随温度呈数量级跳变,流动、传热与电磁场相互牵制,极易引发求解器不收敛或初始值不一致等问题。如何构建高收敛性的数值模型,成为开关设备灭弧性能优化的重要技术基础。通过合理的几何简化、全耦合求解器配置、辅助扫描初始化策略以及参数化建模手段,可以实现对吹弧方案的灵活调整与批量寻优,从而系统性评估气流速度、喷口形状、触头间距等关键因素对熄弧性能的影响。这类仿真方法广泛应用于断路器、接触器等高压电器产品研发,为灭弧室结构设计提供

weixin_29758911的博客 350

经典快速排序与随机快速排序

文章目录一、经典快速排序(一)、经典快速排序的实现理论(二)、经典快速排序的代码实现(Java)(三)、经典快速排序的时间复杂度二、随机快速排序(一)随机快速排序的实现理论(二)随机快速排序的代码实现(Java)(三)、随机快速排序的时间复杂度 一、经典快速排序 (一)、经典快速排序的实现理论 经典快速排序是用数组的最后一个数(这里记为 x )进行划分。也就是 &amp;lt;x、=x、&amp;gt;x。 有...

liyanan的博客 3036

医疗数据采集:Python爬虫爬取医学文献与药品信息(2026合规与伦理版)

医疗数据采集不同于爬取新闻或房价,它直接关系到人的生命健康和法律底线。技术层面:优先使用官方 API (PubMed E-utilities, BioThings),避免解析复杂HTML。法律层面:严守“不碰隐私、不破付费、不传谣言”三条红线。伦理层面:保持对生命的敬畏,确保数据的准确性和用途的正当性。在2026年,一个优秀的医疗数据工程师,不是那个能爬取最多数据的人,而是那个能在合规框架下,利用公开数据解决真实医疗问题的人。请务必珍视您的职业生涯和法律责任,切勿以身试法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 284

构建.NET网站:VSCode还是Visual Studio?揭开开发工具的选择之谜

选择VSCode还是Visual Studio,归根结底是取决于你的具体需求和偏好。🔍 这两款工具各有千秋,都能为你的.NET网站开发提供强大的支持。希望这篇文章能够帮助你更全面地了解这两款工具,做出明智的选择。

墨夶的博客 787

图解快速排序及双路三路快速排序

前言 之前我们介绍了交换类排序中的冒泡排序,这次我们介绍另一种交换类排序叫做快速排序。快速排序的优点是原地排序,不占用额外空间,时间复杂度是O(nlogn)。 当然,对于快速排序来说,它也是有缺点的,它对于含有大量重复元素的数组排序效率是非常低的,时间复杂度会降为O(n^2)。此时需要使用改进的快速排序—双路快速排序,在双路快速排序的基础上,我们又进一步优化得到了三路快速排序。 快速排序 快速排...

子居的博客 1190

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片中。

视觉与物联智能 938

[算法]快速排序与随机快速排序

与归并排序一样,快速排序也运用了分治策略,而随机快速排序是对快速排序的一种优化。

hula_hula_的博客 1635

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

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

快速排序

快速排序

落枫驿站 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

排序算法——随机快速排序

引言 随机快排是一个非常有意思的排序排序算法,它的算法思想用到了如递归、荷兰国旗问题等诸多元素,还意外的引入了随机性的概念。 以下将逐步总结三个版本的快速排序,由浅入深总结快速排序的经典实现过程。 荷兰国旗问题参考:《荷兰国旗问题》 一、快速排序1.0 在荷兰国旗问题中,我们通过简单的逻辑可以将一个数组分为两个区域或三个区域,但往往需要在题目之初给定一个 target 作为目标数以此划分。 而在快速排序算法中,这个 target 选为排序范围上的最右边的数——arr[R],我们以 R 上的数为

Morty的技术乐园 6482

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

什么是快速排序?

文章目录快速排序快速排序简介:基本思想原理快速排序法示意图排序演示Java代码 快速排序 快速排序简介: 快速排序是对冒泡排序的一种改进。 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或者等于另外一部分的所有数据,然后再按照此方法对这两部分数据分别进行快速排序,整个排序的过程可以递归进行,以此达到整个数据变成有序序列。 原理 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选 用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所

热爱编程的菜鸟 5596

分治之快速排序以及快速排序为何最快

算法思想 数组排序任务可以如下完成: 1)设k=a[0],将k挪到适当位置,使得比k小的元素都在k的左边,比k大的元素都在k的右边,和k相等的,不关心在k左右出现均可(O(n)时间完成) 2)把k左边的部分快速排序 3)把k右边的部分快速排序 (假设运气比较好,每次基准元素被移动到中间,这样的话时间复杂度为O(nlogn)) 如何在O(n)的时间内将数组分成两半,一般在小于基准值,一般大于基准值? 程序代码 #include<iostream> using namespace std; int

Java硬件工程师的博客 3189

快速排序之三路快速排序

之前介绍了快速排序和优化版的快速排序 下面再来介绍一种 【三路快速排序】 【代码实现】 //三路快速排序 template<typename T> static void quickSort3Ways(T arr[], int n) { __quickSort3Ways(arr, 0, n-1); } template<typename T> static void

qq_41033011的博客 377

十大排序之快速排序

快速排序 本文将介绍三种快速排序的方法 经典快速排序 随机快速排序 二分快速排序 经典快速排序算法思想 快速排序基于分治的思想,采用递归的方式处理子问题 选取一个哨兵k,这里假设哨兵选取数组第一个元素 即令k = arr[0] = 4 然后设立两个指针 i 和 j 分别初始化指向 第一个元素 和 最后一个元素 第一遍排序 从右往左,依次和哨兵比较,如果大于等于哨兵的值,则 j-- ,否则退出循环,然后交换 arr[i] 和 arr[j] 接着从左往右,依次和哨兵比较,如果小于等于哨兵的值,则 i++

weixin_53235736的博客 887

快速排序和随机快速排序

原创作品 转载请注明出处http://blog.youkuaiyun.com/always2015/article/details/46523531一、问题描述实现对数组的普通快速排序与随机快速排序 (1)实现上述两个算法 (2)统计算法的运行时间 (3)分析性能差异,作出总结二、算法原理:1、快速排序快速排序是对冒泡排序的一种改进。它的基本思想是:选取一个基准元素,通过一趟排序将要排序的数据分割成独

去实验室,奔跑吧 1万+

排序——快速排序

快速排序 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 排序原理: 1、首先设定一个分界值,通过该分界值将数组分成左右两部分; 2、将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值; 3、然后,左边和右边的数

Pluto372的博客 458
上一篇: 排序 - 插入排序
下一篇: 排序 - 希尔排序
codingnote
博客等级 码龄12年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值