【排序算法】快速排序超级总结

面试官超级喜欢问的排序算法 前言 自学了一年JAVA阿巴阿巴终于约到了面试,然而这次面试官让她谈谈对排序算法的理解。 面试官: 你对算法这一块了解吗?排序这一块了解吗? 阿巴阿巴: 了解一点,排序算法这一块主要有冒泡排序、插入排序、希尔排序、选择排序、快速排序、归并排序、堆排序、基数排序、桶排序。 面试官: 很不错,那你知道什么是稳定性吗,这些算法都是稳定的吗?他们的复杂度分别是多少呀? 阿巴阿巴: 稳定性就是说,如果有2个元素a和b,且 a = b,且a排在b前面,如果经过排序算进行排序后,b在a前面了,那么我们就说这个算法是 阅读详情

      快速排序

一、介绍

  快速排序和合并排序有点类似,两者可以相互比较。快速排序也是像合并排序那样将整个序列分成两段分别进行排序。但是快速排序没有合并排序的合并过程。

     该算法是1960 年C.A.R.Hoard提出的一个非常好的排序算法。快速排序算法需要选择一个划分元素,把小于划分元素的元素放在它的左边,大于它的元素放在右边,这样就分成了左右两端,在对左右两段进行排序。

从上面可以得出,划分元素的选择是一个瓶颈。算法的效率取决于划分元素的选择。

二、实现

这里只给出快速排序的递归实现,该算法由两个函数组成,一个是划分函数,另外一个是递归处理函数。

(1)划分函数

/*划分函数*/
//s和t是划分段的起止下标,K是划分元素最终位置
void partition(int a[], int s,int t,int &k)
{
	int i,j,x;
	x=a[s];    //取划分元素
	i=s;        //扫描指针初值
	j=t;
	do
	{
     
		while((a[j]>=x)&&i<j) j--;   //从右向左扫描
		if(i<j) a[i++]=a[j];           //小元素向左移
		while((a[i]<x)&&i<j) i++;      //从左向右扫描
		if(i<j) a[j--]=a[i];            //大元素向右移

	}while(i<j); //直到指针i与j相等
	 
a[i]=x;      //划分元素就位
k=i;
}



 

(1)递归函数

void quick_sort(int a[],int i,int j)
{
	//i和j是划分段的起止下标
	int k;
	if(i<j)
	{
		partition(a,i,j,k);          //调用划分函数对其划分
		quick_sort(a,i,k-1);         //递归的处理左段
		quick_sort(a,k+1,j);         //递归的处理右段
	}
}


 调用方法:

void main()
{   

    int a[]={20,13,4,2,87,9,8,5,46,26};
	int Len=sizeof(a)/sizeof(int);
 	
    quick_sort(a,0,Len-1);
	printf("排序后为:\n");
	for(int i=0;i<Len;i++)
		printf("%d ",a[i]);
}


三、复杂性

快速排序的平均复杂度和合并排序是一样的,都是O(n*log(n)),但是最坏情况下为O(n2),这和冒泡排序是一样的。很明显,最坏的情况是输入数据是已经排好序的,但是在实际情况下很少出现这样的情况。

三、应用

(1)为什么用快速排序

   

 1.因为快速排序的递归实现很简单

 2.在一般情况下,快速排序的速度和合并排序一样,都是O(n*log(n))

  3.该方法不需要合并过程

(2)为什么不用快速排序

    1.因为在最坏情况下,该方法和冒泡排序一样,很慢

    2.迭代的实现很困难。

    3.对于某些数据类型,有其他更快的排序方法。

 

总结:

输入数据次序越乱,所选划分元素值的随机性越好,排序速度越快,反之,输入数据越有序,排序速度越慢,可见快速排序不是一种自然的排序算法。

即使采用前面介绍的选取中值的方法,也无法保证划分产生的子2问题大小完全平衡。至多能改变算法平均的时间性能,无法改变最坏情况的时间性能。在最坏情况下,快速排序的时间复杂度总是O(n2)。

   

易语言超级列表框排序技术实现 本文还有配套的精品资源,点击获取 简介:易语言超级列表框排序技术是一种在易语言编程环境下,通过高级功能对列表框中的数据进行高效管理的方法。超级列表框通过提供多列排序、自定义列宽、复选框等功能,改善用户交互体验。本技术涵盖了消息处理、自定义排序函数、数据保存、文本处理以及与Windows API交互等关键概念,是提升易语言用户界面设计与交互能力的基础。 1. 易语言... 阅读详情

相关推荐

Kylin-Desktop-V10-SP1-General-Release-2303-X86_64-海光版(hygon c86)安装与配置指南

本文提供了在国产海光C86处理器平台上安装与配置Kylin Desktop V10 SP1操作系统的详细指南。内容涵盖从下载专用镜像、制作启动盘、BIOS关键设置、磁盘分区方案,到系统安装后的驱动优化、必备软件安装及常见故障排除,旨在帮助用户顺利完成hygon c86平台的系统部署与优化。

tree的博客 1355

八大排序算法 —— 快速排序

快速排序 核心思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 盗来一张图: 算法优缺点 快速排序最“快”的地方在于左右两边能够快速同时递归排序下去,所以最优的情况是基准值刚好取在无序区的中间,这样能够最大效率地让两边排序,同...

C先生的博客 1054

AMD Ross FPGA Agent 实战:用 AI 驱动 Vivado 开发流程

在 EDA 领域,FPGA 开发长期面临工具链重、反馈周期长、报错晦涩等痛点。AI Agent 通过自然语言交互与工具调用,将 Vivado 的 Tcl 批处理流程封装为可编排、可观测的智能体,显著降低查文档与读报告的时间成本。其核心在于 Harness 与 Agent 的协同:Harness 提供安全执行环境,Agent 负责决策与迭代。典型应用包括工程创建、约束生成、综合实现报告解读及比特流失败排查。本文以 AMD Ross 为例,拆解其架构设计与实操方法,帮助开发者理解如何将 Agent 落地到高门槛

weixin_29189363的博客 1020

程序设计综合实践题库答案

第一章: 1 【多选题】 (2分) 抽象数据类型ADTList的基本操作有( )。 A.两个线性表合并Merge() B.销毁线性表Destroy (L) C.创建空表Create () D.迭代下一位置NextPosition (L,pos) BCD 2 【判断题】 (2分) 算法和程序是一样的,都必须符合特定程序设计语言的语法。( ) A.错 B.对 A 3 【单选题】 (2分) 采用顺序存储结构实现抽象数据类型ADTList时,下面基本操作中实现算法时间复杂度不是常量阶的是( )。 A.Create

qq_50588811的博客 5740

15、远程操作水下航行器(ROV)的非线性控制系统设计

本文探讨了远程操作水下航行器(ROV)的非线性控制系统设计,重点介绍了多变量PID控制、改进的PD控制和滑模控制三种方法。详细阐述了各控制策略的原理、建模与仿真过程,并通过对比分析其在稳态误差、振荡、抖振及跟踪效果等方面的性能表现。文章还提出了针对不同控制方法的优化建议,并给出了选择合适控制策略的决策流程,为ROV高精度运动控制提供了系统性解决方案。

sun99的博客 156

零基础DSP实战TMS320F28035:第九节,ADC比较器&EPWM

ADC比较器框图如下所示:-电压-----------------------------输出-电压A>电压B------------------ 1-电压A

sinat_30943509的博客 2535

十大经典排序算法-快速排序算法详解

一、什么是快速排序 1.概念 快速排序(Quick Sort)是从冒泡排序算法演变而来的,实际上是在冒泡排序基础上的递归分治法。快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分 2.算法原理 这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照快速排序的思想,我们先选择一个基准元素,进行排序 我们选取4为我们的基准元素,并设置基准元素的位置为index,设置两个指针left和right,分别指向最左

qq_35344198的博客 8万+

一篇文章带你搞定数学建模里的主成分分析(05年水质问题示例应用讲解含代码)

文章目录一、题目分析二、原理公式三、MATLAB实现某一地区的主成分分析四、MATLAB 实现所有地区28个月的综合分析五、注意 一、题目分析 对长江近两年多的水质情况做出定量的综合评价,并分析各地区水质的污染状况 考虑到各指标之间可能存在一定的相关性,选用主成分分析法对长江流域主要城市水质检测报告进行分析,选取主成分,并把主成分得分按照方差贡献率加权求和,得到每个地区的污染综合评价指数,进而可以计算每个月长江流域的污染综合评价指数,对平均综合评价指数进行排序 二、原理公式 根据主成分分析的方法,分析长江沿

南淮北安的博客 2624

算法 - 快速排序(Quick_sort)

快速排序(Quick_sort)的特点就是:序列越乱越快,越有序越慢。最优情况:O(nlogn)每趟排序数据元素都能被平均分配成两个部分,形成一个完美的二叉树。最坏情况:O()也就是原序列相对最有序的情况,形成的树只有左子树和右子树,比较次数为:(n - 1) + (n - 2) + (n - 3)+……+ 1 = n * (n - 1)/2空间复杂度:O(1)..................

曾铎的博客 9589

OWASP 2025版AI大模型攻击安全风险汇总(攻击方法种类)

提示词注入是大模型最基础、最常见的核心漏洞,攻击者通过构造直接或间接的恶意自然语言输入,篡改大模型原本的正常行为与输出结果。哪怕这类恶意内容对人类是隐藏、不可见的,只要模型能够正常解析读取,就会触发漏洞。它和大家常说的模型“越狱”相关,但并不等同:越狱是提示词注入的极端形式,会直接让模型彻底无视所有内置安全协议,完全脱离管控;而普通提示词注入,更多是针对性篡改模型行为、诱导执行特定操作。

墨痕诉清风的博客 514

《UDS协议从入门到精通》系列——图解0x38:请求文件传输

详细解释UDS协议中0x38-请求上传服务的各个参数!!

车载系统攻城狮 3263

排序算法 - 快速排序(4种方法实现)

本文介绍了快速排序算法的挖坑法,前后指针法,左右指针法,非递归实现,以及使排序算法效率提高的三数取中

originalHSL的博客 1万+

SillyTavern 酒馆在 Mac 和 Linux 上的部署教程(含启动器安装方法)

SillyTavern 是一个支持多种大模型聊天接口的本地前端项目,适用于 MacOS 和 Linux 系统。本文提供了两种部署方式:手动安装和使用 SillyTavern Launcher 安装器。手动安装需要先安装 Git 和 NodeJS,然后克隆项目源码并运行启动脚本。使用 Launcher 则更为简便,适合新手用户,能够自动安装依赖和配置环境。部署完成后,用户可以通过浏览器访问本地服务器,加载角色卡片并连接大模型 API,享受二次元角色扮演聊天的乐趣。无论是开发者还是终端用户,都能轻松完成 Sil

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3392

排序算法_快速排序

目录 【快速排序】 【快速排序】 快速排序是冒泡排序的超级升级版,排序过程以{6,1,2,7,9,3,4,5,10,8}为例见下图: 代码实现: package cn.dataStructureAndAlgorithm.demo.sort; import java.util.Arrays; public class 快速排序_QuickSort { public static void main(String[] args) { int data[..

泥煤少年的博客 460

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

一趟快速排序的实质结果是什么_一点就懂的十大经典排序算法

我是优快云博主「雨夜※繁华」,这是我的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:一点就懂的经典十大排序算法_大数据_LH is programming hard-优快云博客 1、概述十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不...

weixin_39547392的博客 1448

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java 快速排序_java排序算法之快速排序及其改进

快速排序算法算是所有排序算法中知名度最高的了,应用也超级广泛,正是由于其良好的性能才独得恩宠。今天就来好好的认识一下快速排序。一、原理快速排序一般都是使用递归来实现的,采用的是“分而治之”的思想。一组待排数据,选择一个基准元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,然后对这两部分重复同样的操作。上面的过程你会发现,这一趟扫描可以增大元素之间的移动距离,因为...

weixin_39851279的博客 222

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【排序算法详细介绍】桶排序(Bucket Sort)冒泡排序(Bubble Sort)快速排序(Quick Sort)

详细介绍了桶排序,冒泡排序以及快速排序,std::sort

TYJhhxx的博客 1843

【图解】快速排序---超级容易理解的做法

打算开始写算法专栏了,第一篇文章写什么呢?就快速排序吧! 快速排序的思想就是分治的思想,分治思想在算法中是非常常用也是非常重要的!一个问题,可以把它一分为二,然后再分别处理,依次类推,这就是分治的思想。 那么快速排序是怎么一回事呢?我来告诉你: 快速排序指的的,我们从一组数中任意选定一个数字(我们称这个数字叫基准值),然后经过一轮排序后使得小于基准值的数全部在基准值的左边;大于基准值的数全部在基准值的右边。这样我们从大的模块上来说就有序了,左边部分的最大值小于右边部分的最小值,然后再分别对左边部分快排,右边

【叫我姜同学】的个人博客 946

超级无敌各种排序算法 一个代码解决<可以做后序模板>

各种排序代码汇总以及原理

Cai_xiaohei的博客 319

【算法】基于hoare快速排序的三种思想和非递归,基准值选取优化【快速排序的深度剖析-超级详细的注释和解释】你真的完全学会快速排序了吗?

【快速排序】深度剖析,跟着博主深度理解快速排序的精髓和思想!干货满满不要错过哦!

系统编程、网络编程 947

七大排序算法的基本原理和实现(超详细,逐步图解,超级易懂)

1. 元素集合越接近有序,直接插入算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1)4. 稳定性:稳定。

2301_76928097的博客 2426

leetcode912. 排序数组 超级通俗易懂、全面的快速排序教程(优化重复元素、实例有序问题)

本文档详细介绍了快速排序算法及其优化方案,包括Lomuto分区与Hoare分区方法。快速排序是一种高效的排序算法,其核心在于通过选择一个“基准”来将数组划分为两个子数组,递归地对这些子数组进行排序。文档中不仅解释了这两种分区的基本思想和实现细节,还讨论了如何通过随机选择基准值来避免最坏情况的发生,并对比了它们的效率差异。此外,文中提到了JDK中采用的双轴快速排序及对小数组使用插入排序的优化策略,展示了高效排序算法在实际应用中的重要性。

我只管埋头前行,剩下的交给时间。 1475

超级易懂快速排序 Python

快速排序 思路 1. 找出一个枢纽节点key 2. 将数组划分成左右两部分数组,左边数组中的值都比枢纽节点的值小,右边数组中的节点的值都要key比枢纽节点key的值大 3. 对左边数组进行求解,返回排序后的数组 left_arr 4. 对右边数据进行求解,返回排序后的数组 right_arr 5. 将左边数组和右边数组以及枢纽节点进行拼接 简洁版本 class Solution(): d...

看清这个世界 253

【数据结构与算法】Java实现七大排序算法汇总

凿壁偷光,8000字总结Java实现七大排序算法!

冲击大厂之路!!! 2617

一点就懂的经典十大排序算法

文章目录1、概述2、十大算法性能比较3、排序算法精讲3.1 超级经典的冒泡排序和它的优化3.2 快速排序(分而治之) 1、概述 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间...

LH is programming hard 1852

【数据结构】【排序】其实超级简单啦!

把数据结构的六大排序都总结出来了喔!

Reeuse的博客 1308
上一篇: 【排序算法】合并排序超级总结
下一篇: Matlab 制作《最炫民族风》弱爆了,附代码
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值