`
Tonyguxu
  • 浏览: 280429 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【排序】快速排序

 
阅读更多

前言

快速排序(Quick Sort)算法是 “递归+分治”算法一个很好的应用。

算法思想

     快速排序是找出一个元素(理论上可以随便找一个 注1)作为基准值(pivot),然后对数组进行分区操作:找到基准点——使基准点左边元素的值都不大于基准值,基准点右边的元素值都不小于基准值,找到基准点后就可以将基准值放到基准点上,这样在该基准点左边的值都小于右边的值,基准点两边为两个分区。递归体现为,对前个阶段产生的分区再找基准点产生了分区再找基准点...直到分区中只有一个元素为止或者说所有元素都排好序为止。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

 

注1 基准位置不同的影响?

名词:基准值和基准点

基准值一般选择某partition的第一个元素。

该partition的基准点是这样一个点:在该partition中,该点左边的所有元素不大于点右边的元素。

基准点是分区的依据。

 

算法演示

 

   2  8  7  1  3  5  6  4
  i->                     <-j
  
(找大)                (找小)

这里找大和找小都是与i和j位置上的数与基准值比较
一、j
j找第一个小于2的元素1,1赋给(覆盖重置)i所指元素2
得到:
   1  8  7     3  5  6  4
      i       j
      
      
二、i
i找到第一个大于2的元素8,8赋给(覆盖重置)j所指元素(NULL<-8)
   1     7  8  3  5  6  4
      i   <-j

三、j
j继续左移,在与i碰头之前,没有找到比2小的元素,结束。
最后,主元2补上。
第一趟快排结束之后,数组变成:
  1  2  7  8  3  5  6  4

第二趟,
        7  8  3  5  6  4
        i->             <-j
         (找大)        (找小)
  
一、j
j找到4,比主元7小,4赋给7所处位置
得到:
        4  8  3  5  6   
        i->                j
二、i
i找比7大的第一个元素8,8覆盖j所指元素(NULL)
        4     3  5  6  8
            i          j
        4  6  3  5     8
            i->       j
                 i与j碰头,结束。
第三趟:
        4  6  3  5  7  8
......
以下,分析原理,一致,略过。
最后的结果,如下图所示:
  1  2  3  4  5  6  7  8

算法实现

两个函数Partition和QuickSort。Partition负责分区(或者说寻找某分区的基准点)。QuickSort负责递归,将某个区再分区,直到一个分区只有一个元素为止。

 

在某个分区中找基准点过程中,分别有指针从分区头和尾向中间移动,R指针向左移动,寻找小于基准值的位置,如果小于基准值则停止左移,将该位置上的值赋给L指针所在位置。然后,L指针右移,寻找大于基准值的位置,如果大于基准值则停止右移,将该位置上的值赋给R指针所在位置,然后再由R指针左移。。直达R指针遇到L 指针为止。此时L指针所指位置即为要寻找的基准点。

 

//begin :一个parttition的起始点,end :partition的结束点
//return :该partition的基准点
int Partition(int array[],int begin,int end){
  int privot = array[begin]//基准值
  int L = begin;
  int R = end;
  while(L < R){
     while(R > L && array[R] > privot)
        R--;
     array[L] = array[R];
     while(R > L && array[L] < privot)
        L++;
     array[R] = array[L];
  }
  array[L] = privot;//将基准值放到基准点
  return L;
}

 void QuickSort(int array[],int begin,int end){
  int privot;
  while(begin < end){
     privot = Partition(array,begin,end);
     QuickSort(array,privot+1,end); //递归
     QuickSort(array,begin,privot-1);
  }
}

 

性能分析

 

相关应用

 

参考阅读

1. http://www.cnblogs.com/zabery/archive/2011/07/27/2118353.html

再研究下性能分析部分

 

2. http://jsdo.it/norahiko/oxIy/fullscreen

多个排序算法的演示

 

3.JDK Arrays.sort(int[])对快排的优化

http://hxraid.iteye.com/blog/665095

 

4.完整的文章

http://blog.csdn.net/v_JULY_v/article/details/6116297

分享到:
评论

相关推荐

    数据结构课程代码部分.zip

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的检索、存储和操作。本压缩包“数据结构课程代码部分.zip”包含了一系列与数据结构相关的编程实践,是学习和理解数据结构理论的实用补充。 在数据结构的学习中,我们会接触到以下关键概念: 1. **数组**:最基本的存储结构,用于存储同一类型的数据元素。数组提供了通过索引访问元素的固定时间复杂度O(1)。 2. **链表**:链式存储结构,每个节点包含数据和指向下一个节点的指针。分为单链表、双链表和循环链表等。链表插入和删除操作比数组更灵活,但随机访问性能较差。 3. **栈**:后进先出(LIFO)的数据结构,主要用于实现递归、函数调用、表达式求值等。常见的操作有push(入栈)和pop(出栈)。 4. **队列**:先进先出(FIFO)的数据结构,常用于任务调度、打印队列等。基本操作包括enqueue(入队)和dequ。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    springboot345基于java敬老院管理系统2023_35806.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    redis-windows-6.2.6.4.zip

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值对存储系统,常被用于数据库、缓存和消息中间件的角色。它以其快速、灵活和数据持久化等特点,在IT行业中备受青睐。尤其是在Windows平台上,Redis提供了良好的支持,使得开发者在非Linux环境下也能便捷地使用Redis服务。 Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合,这些数据结构的设计使得它非常适合处理各种数据存储和处理任务。例如,字符串是最基础的类型,可以存储简单的文本或数字;哈希表则适合存储对象,每个键对应一个字段,字段的值可以是任意类型的键值对;列表允许存储有序的序列,可以进行两端插入和弹出操作;集合是无序且不重复的元素集合;有序集合则在集合的基础上增加了分数值,可以进行排序。 在Windows上安装Redis 6.2.6.4版本,首先需要下载zip压缩包“redis-window。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    分布式电源选址定容 Matlab编程 综合考虑投资成本、电压偏移量和线路网损,构建分布式电源定容选址的数学模型,通过启发式算法求解出分布式电源配置及最优选址 注:对分布式电源不做区分!

    分布式电源选址定容 Matlab编程 综合考虑投资成本、电压偏移量和线路网损,构建分布式电源定容选址的数学模型,通过启发式算法求解出分布式电源配置及最优选址。 注:对分布式电源不做区分!

    springboot374预报名管理系统--论文pf.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    基于模型预测控制 (MPC) 的联盟控制模型 (CCM),带有一个捕鱼模型来分配捕鱼船队,以通过穷举启发式搜索来最大化捕获的鱼。.zip

    基于模型预测控制 (MPC) 的联盟控制模型 (CCM),带有一个捕鱼模型来分配捕鱼船队,以通过穷举启发式搜索来最大化捕获的鱼。 资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、说明、论文、数据集一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 4、如有侵权请私信博主,感谢支持

    内置式永磁同步电机IPMSM,最大转矩电流比MTPA控制仿真模型

    内置式永磁同步电机IPMSM,最大转矩电流比MTPA控制仿真模型

    OpenScenario场景仿真搭建 , OpenScenario是 自动驾驶仿真软件carla推出来的场景仿真标准,可配合carla一起完成整套自动驾驶的闭环仿真过程,将场景搭建变成可编程化的方式

    OpenScenario场景仿真搭建 , OpenScenario是 自动驾驶仿真软件carla推出来的场景仿真标准,可配合carla一起完成整套自动驾驶的闭环仿真过程,将场景搭建变成可编程化的方式。 可以模拟出自动驾驶真实环境中出现的各种各样的路况环境,例如:被动超车场景、跟车变道场景、道场景等等。 本教程有完善的非常简单环境搭建说明文档,不依赖gpu、opengl等熏染工具,并配有简单清晰易懂的加载运行流程。 倘若您希望进一步了解学习场景文件是如何通过编辑编程实现的,您可以关注我们的另一个项目,OpenScenario场景仿真结构思维导图。 实实在在的工作经验总结 资料是一线自动驾驶工程师辛苦工作的结果,希望您尊重知识产权不要私自外传,由于工程师项目多,所以不做后技术服务和指导

    配电网规划程序编写,配电网优化运行程序编写,分布式电源选址定容,电动汽车充电站选址定容,储能设备的优化配置

    配电网规划程序编写,配电网优化运行程序编写,分布式电源选址定容,电动汽车充电站选址定容,储能设备的优化配置。

    基于PLC的升降横移立体停车库的设计,设计一个基于西门子S7-200 PLC控制核心的,三层三列,九个车位的立体停车控制系统 目录3 1 绪 论4 2 设计要求5 3 硬件设计8 3.1 PL

    基于PLC的升降横移立体停车库的设计,设计一个基于西门子S7-200 PLC控制核心的,三层三列,九个车位的立体停车控制系统。 目录3 1 绪 论4 2 设计要求5 3 硬件设计8 3.1 PLC型号的选择和确定8 3.2 主电路设计8 3.3 控制电路图11 3.4 PLC输入和输出地址分配表13 3.5 PLC接线图14 4 程序设计17 4.1 PLC 内部使用地址分配17 4.2 流程图17 4.3 PLC梯形图20 4.4 PLC语句表程序27 5 组态画面的设计28 5.1通信建立28 5.2 组态王变量连接31 5.3 建立画面33 5.4 运行35 结束语38 参考文献39 致 谢40 附 录41 附录1 PLC语句表程序41 附录2 组态王命令语言82

    串口调试助手软件,socket通信调试助手软件 很好用的两个助手软件功能强大,侦测,拦截,逆向分析串口通汛协议,是RS232 422 485串行端口的专业工貝软件

    串口调试助手软件,socket通信调试助手软件。 很好用的两个助手软件功能强大,侦测,拦截,逆向分析串口通汛协议,是RS232 422 485串行端口的专业工貝软件

    基于单片机的设计的声光双控智能路灯,包含仿真,程序,参考文

    基于单片机的设计的声光双控智能路灯,包含仿真,程序,参考文

    labview yolov5 onnxruntime推理,封装dll, labview调用dll,支持同时加载多个模型并行推理,可cpu gpu, x86 x64位,识别视频和图片,cpu速度100

    labview yolov5 onnxruntime推理,封装dll, labview调用dll,支持同时加载多个模型并行推理,可cpu gpu, x86 x64位,识别视频和图片,cpu速度100ms,gpu26ms,只需要替模型的onnx和nameclass即可

    BUCK电路的仿真,simulink仿真 采用PI闭环方式进行控制 了解BUCK变器的基本原理,并对BUCK变器进行仿真,研究其控制方式与及其基本功能,观察关键节点的波形 输入电压12V,输出电压

    BUCK电路的仿真,simulink仿真 采用PI闭环方式进行控制。 了解BUCK变器的基本原理,并对BUCK变器进行仿真,研究其控制方式与及其基本功能,观察关键节点的波形。 输入电压12V,输出电压1.2V,使用PI闭环进行调节,开关频率为90kHz。 各个部分参数如下所示。

    VNC远程软件,个人学习整理,仅供参考

    ===如资源质量问题,可半价退款,代下全网资源,价格公道==== VNC(Virtual Network Computing)远程软件是一种基于图形用户界面的远程控制技术,它允许用户通过网络访问并控制另一台计算机的桌面。VNC系统由两部分组成:服务器端(VNC Server)和客户端(VNC Viewer)。在远程计算机上安装VNC Server后,任何拥有VNC Viewer的设备都可以连接到该服务器,实现对远程计算机的实时操作。 VNC的核心工作原理是利用RFB(Remote Framebuffer)协议,该协议负责在远程服务器和客户端之间传输屏幕图像和键盘鼠标输入。当用户在客户端进行操作时,这些操作会通过网络发送到服务器,服务器则更新其显示并反馈给客户端,从而实现远程控制。 VNC有多种实现,例如RealVNC、 TightVNC 和 UltraVNC等。其中,"VNC4"可能是特定版本或变种的代号,可能包含一些特定功能或优化。具体的功能和特性通常会在版本更新中有所改。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    redis5.0.14安装包,包含linux和win

    Redis是世界上最受欢迎的开源内存数据结构存储系统,它可以用作数据库、缓存和消息代理。在本压缩包中,我们有三个版本的Redis,分别是Redis 7.0.9、Redis 5.0.14的Linux版和Windows版。接下来,我们将详细探讨如何在这些操作系统上安装和使用Redis。 **Redis 5.0.14 for Linux** 1. **下载与解压**:你需要从提供的压缩包中提取`redis-5.0.14.tar.gz`到你的Linux系统。通常,你可以使用`tar -zxvf redis-5.0.14.tar.gz`命令来解压文件。 2. **编译与安装**:进入解压后的目录,例如`cd redis-5.0.14`,然后运行`make`进行编译,接着执行`sudo make install`进行安装。这将把Redis二进制文件安装到系统默认的可执行路径,通常是`/usr/local/bin`。 3.。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    基于S7-300 PLC和组态王组态控制的恒压供水系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面

    基于S7-300 PLC和组态王组态控制的恒压供水系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面

    基于格雷码的结构光三维重建源码,MATLAB可以跑通

    基于格雷码的结构光三维重建源码,MATLAB可以跑通

    一个关于机器人操纵运动规划的项目,使用基于 ROS 和 Gazebo 模拟的深度强化学习.zip计算机、自动化、电子信息等相关专业毕业设计&大作业 (源码、说明、论文、数据集一站式服务,拿来就能用的绝

    一个关于机器人操纵运动规划的项目,使用基于 ROS 和 Gazebo 模拟的深度强化学习 资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、说明、论文、数据集一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 4、如有侵权请私信博主,感谢支持

    动画-滑动动画.html

    动画-滑动动画.html

Global site tag (gtag.js) - Google Analytics