快速排序——java实现

Java经典算法之快速排序算法 快速排序是一种分治法(Divide and Conquer)的排序算法,由英国计算机科学家Tony Hoare于1960年提出。其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,最终达到整个序列有序的效果。 阅读详情

 快速排序是一种常用且比较复杂的排序算法,最坏的情况下运行时间为O(n2) ,  期望的运行时间为O(nlgn). 快速排序采用分治思想,分治过程分为三个步骤。(ps:以下思想参考算法导论)

分解: 数组A[p...r] 被划分成2个子数组。  子数组A[p..q-1](ps:可以把它想象成数组中的前半部分 )和A[p...r](ps:可以把它想象成后半部分)。使得A[p....q-1]中的每个元素都小于等于A(q),而且小于等于A[q+1....r]中的元素。下标q也在这个划分过程中计算... (ps:什么意思呢.假定我们有待排序数组,数组长度为10 那么我们可以把其中的第一个元素取出来 和后半部分的元素进行比较 如果比第一个元素小 那么我们将那个小于第一个元素的后半部分的那个元素取出来 放到第一个元素的下标位置. 然后在从前半部分找比这个第一个元素小的元素把他填充到后半部分刚刚取出来的那个元素的位置 直到数组中没有比这个第一个元素大或者小的数. 这里我们已经完成了一遍分治思想。 因为这个取出来的第一个元素他最后被填充的位置的前半部分一定都比他大 后半部分都比他小.


解决: 通过分解后 ,我们可以递归调用 对子数组 A[p..q-1]和A[q+1.....r]排序 其实就是对前半部分和后半部分的子数组进行递归调用,让他一遍遍的分解。直到 p==r 递归调用完毕


伪算法(ps:伪算法参考算法导论)


QUICKSORT(A,p,r)

if p< r

then q<- PARTTION(A,p,r);

QUICKSORT(A,p,q+1);  //对前半部分进行分解

QUICKSORT(A,q-1,r);  //对后半部分进行分解


下面以个人理解实现:

   public int Q_sort(int array[] , int begin, int end)
   {
   int pos = array[begin];  //第一个匹配位置空出来
   
   while(begin<end)
   {
      while(begin<end && array[end]>=pos)
      end--;
      array[begin]= array[end];
      
      while(begin<end && array[begin]<=pos)
      begin++;
      array[end]=array[begin];
   }  //对pos的数组分治一次
    array[begin]= pos;    
  return begin; 
   }
   
   public void sort_rt(int array[], int begin, int end)
   {
  if(begin < end)
  {
  int p =Q_sort( array, begin, end);
  sort_rt(array, begin,p-1);
  sort_rt(array, p+1,end);
  }
 
   }

Java实现快速排序 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列。 2 解决方案 2.1 快速排序原理简介 引用自百度百科: 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整... 阅读详情

相关推荐

java实现稳定的快速排序

一、思路 一般的快速排序为不稳定的,如果实现稳定的快速排序,则需要在partition过程中进下特殊的处理,其中一种方法是另为申请一段空间B,在原来的数据空间A中,选取第一个元素flag为中间数据,首先遍历空间A,将所有小于flag的元素依次放入空间B中,然后将flag放入B中,再次遍历空间B,将所有大于等于flag的元素依次放入空间B中,最后重新将空间B的数据全部拷贝到空间A中。 二、代码

wozhaosini的专栏 2997

【Java】快速排序

本文介绍了快速排序的原理优点,以及如何选取基准元素,交换元素的方法等。

zcxyywd的博客 2万+

Spring Authorization Server自定义密码模式:突破标准OAuth2限制,实现MFA与复杂业务集成

OAuth 2.0授权框架是构建现代应用安全体系的基石,其密码模式(Resource Owner Password Credentials Grant)提供了一种直接的资源所有者凭证交换令牌的机制。该模式的核心原理是客户端收集用户密码并直接向授权服务器请求访问令牌,适用于受信任的客户端场景。在技术价值上,它简化了某些传统应用的OAuth集成流程。然而,标准实现往往难以满足复杂的现实业务需求,例如需要集成多因素认证(MFA)、对接外部LDAP目录服务或执行自定义密码加密校验等场景。Spring Authori

weixin_34302561的博客 438

java 实现快速排序

1.介绍 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序 过程可以递归进行,以此达到整个数据变成有序序列。 2.切分原理 切分原理: 把一个数组切分成两个子数组的基本思想: 1.找一个基准值,用两个指针分别指向数组的头部和尾部; 2.先从尾部向头部开始搜索一个比基准值小或等于的元素,搜索到即停止,并记录指针的位置; 3.再从头部向尾..

m0_46306264的博客 1万+

T12 电烙铁简单程序逻辑

通过分析就可以知道,发热丝本身即是发热体,也是热偶的工作端。怎么可能是热电动势呢,确实,但不要忘了T12-OUTPUT端的电压是PWM波,理论上是有单片机PWM电压为0 v时的,而T12-OUTPUT端的电压此时也应为0。在T12烙铁头中,PID控制算法通过监测温度传感器的输出,计算当前温度与设定温度之间的差异,并根据这一差异调节加热功率,以实现烙铁头温度的精确控制。这段代码实现了一个简单的增量式PID控制器,通过计算当前温度与期望温度之间的差异以及历史偏差值,调节输出控制量,实现对温度的精确控制。

hgkhjkljnl的博客 1万+

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1262

Java快速排序

前后相邻的两个数两两进行交换,如果前面的数大于后面的就交换,否则不交换,直到最大的数到达最后,循环这一过程直至全部排序完成。一趟遍历下来排好了7的位置,然后再从头开始这次只需要拍好7前面的数组就好了,每次循环中最大的那个数,都会排好位置,就像一个气泡一个一个的到达排好的位置,所以叫做冒泡排序。

G81948577的博客 8375

RTL优化与PPA分析:数字电路设计的关键技术

在数字集成电路设计中,RTL(寄存器传输级)优化是提升芯片性能、降低功耗和减小面积的核心技术。通过PPA(Power-Performance-Area)指标的平衡,工程师可以在不同时序约束下实现设计的最优化。本文基于Synopsys Design Compiler和开源工具Yosys的实验数据,展示了RTL优化在算术单元和控制逻辑中的显著效果,特别是在乘法器和除法器等复杂运算模块中。文章还探讨了AI辅助工具在RTL优化中的应用潜力,为数字电路设计提供了实用的技术参考和工程实践建议。

weixin_42186387的博客 621

Java 快速排序

快速排序是一种常用的基于比较的排序算法,其时间复杂度为 O(nlogn),并且具有稳定性和广泛的应用场景。本文将全面详细的讲解一下 Java 中快速排序算法的原理、实现以及时间复杂度等问题。

兴趣是最好的老师,勤能补拙 1万+

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+

linux v3h平台开发系列详解(GMSL摄像头篇):1.11 解串器MIPI 1.5G高速率特殊deskew配置

解串器max96712 deskew配置

xian18809311584的博客 1777

快速排序Java代码实现

快速排序Java代码实现 1. 快速排序原理 (1)定义一个基准元素base(我这里定义的是最左面的元素定位基准元素) (2)定义两个变量i和j,j先从右向左遍历,找到第一个比base小的数就停止,i再从左向右便利找到第一个比base大的数停止 (3)交换i和j指向的元素 (4)直到i和j指向同一个元素,将这个元素与基准元素交换 递归求解即可 2. 时间复杂度:O(nlogn) 3. 代码实现 public class Qsort { public static void main(String[] a

m0_48372408的博客 3590

详解FreeRTOS:低功耗Tickless模式(高级篇—7)

FreeRTOS提供了一个叫做Tickless的低功耗模式,本篇博文我们就来学习一下如何使用这个Tickless模式。

不脱发的程序猿 1900

快速排序Java代码简洁实现

学习过数据结构的同学们都知道,快速排序算法是一种时间复杂度为O(nlogn)的排序算法,在各种排序算法中算是较为高效的方法,企业面试中也经常有手撕快排的环节。本文将阐述算法的基本思想,并用Java代码的形式实现快速排序代码。 算法思想 快速排序主要采用分治的基本思想,每次将一个位置上的数据归位,此时该数左边的所有数据都比该数小,右边所有的数据都比该数大,然后递归将已归位的数据左右两边再次进行快...

技术进阶之路 4352

【NVMEM子系统】二、NVMEM驱动框架

该子系统整体架构不算太大,还是比较容易去理解的,下面我们一起去一探究竟!,该子系统主要用于实现EEPROMEfuse等非易失存储器的统一管理。在早期,像EEPROM驱动是存放于目录下,由于没有做到好的抽象,每次需要去访问相应内存空间,都需要去复制几乎一样的代码,去注册sysfs,这是一个相当大的抽象泄露。NVMEM子系统就是为了解决以往的抽象泄露问题。

Donge's Blog 1715

NTscan扫描工具

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

java实现快速排序算法

快速排序 1、算法思想 快速排序是由冒泡排序改进而得到的,是一种分区交换排序方法。思想如下: 一趟快速排序采用从两头向中间扫描的方法,同时交换与基准记录逆序的记录。 (1)在待排序的N个记录中任取一个元素(通常取第一个记录)作为基准,称为基准记录; (2)定义两个索引 left 和 right 分别表示“首索引” 和 “尾索引”,key 表示“基准值”; (3)首先,尾索引向前扫描,直到找到比基准值小的记录(left != righ),并替换首索引对应的值; (4)然后,首索引向后扫描,直到找到比基准值大于

EatingSoilLang 6752

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

快速排序算法Java实现

快速排序算法Java实现 快速排序是运用广泛的一种排序算法,其时间复杂度是nlog(n),用到了分治的思想,以下是快排的Java实现。 首先定义一个接口Sorter,此接口的第一个sort方法接收一个list数组,该数组中的对象要求必须继承了Comparable类,通过Comparable类的compareTo()方法来进行比较;第二个sort方法接收一个list数组和一个Comparator 类...

qq_40373914的博客 550

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java实现快速排序

分别采用双边循环法和单边循环法实现快速排序 public class QuickSort { /** * 双边循环法实现快速排序 * @param arrays 待排序数组 * @param left 需要排序数据左指针下标 * @param right 需要排序数据右指针下标 */ public static void qu...

bug的博客 243

快速排序(java实现)

快速排序的思想 在一个无序的数组中,取最后的一个数字为基准值,在经过一次排序后,使得改无效而的数组中,小于基准值的在左侧,等于基准值的在中间,大于基准值的在右侧。 假设一个无序数组为 那么他经过排序后的结果应该为: 具体实现过程: 在排序的时候,我们每次都取最后一个元素为基准值,创建p1指向无序数组元素的前一个位置,创建p2指向无序数组的最后元素的后一个位置。 第一次排序,首先i指向第一个元素,判断当前元素是和基准值的大小 大小的比较分为三种情况: 第一种:该元素 < 基准值,则该元素与p1指

qq_56330528的博客 7106

快速排序-java实现

快速排序-java实现 快速排序(Quicksort)是对冒泡排序的一种改进。 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 JAVA实现: public class Test { public static voi...

qq_30166123的博客 764

快速排序java语言实现

快速排序是很重要的排序算法,但是我在学的时候发现网上没有特别好的例子所以自己动手写了一个。 自己动手丰衣足食。 package sort; import java.util.Random; public class QuickSort { @SuppressWarnings("unused") public boolean initTestArray(int[] testArr

weiqianghu的博客 1291

Java实现快速排序图解

快速排序快速排序法介绍图解代码理解 快速排序法介绍 快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将 要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 图解 代码理解 public class QuickSort { //从小到大排序 public void quickSort(int left, int right,

weixin_40460171的博客 1127

JAVA实现快速排序及解析

快速排序定义 快速排序和归并排序一样,运用了分治的思想,下面是对一数组A[p…r]进行快排的三步分治过程: 分解:把数组A分成(可能为空的)两部分,A[p…q-1]和A[p+1…r],左边子数组的每个元素都小于或等于A[q],显然,右边子数组的每个元素都大于A[q]。 解决:用地柜调用快速排序,对两个子数组进行排序。 合并:不需要另外进行合并操作,直接返回排好序的A。 快速排序性质 最坏运行时间是...

Lucky Day Day Up 1385

Java 实现快速排序

Java 实现快速排序原理逻辑Java代码实现 原理逻辑 同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。 不同的是,冒泡排序在每一轮只把一个元素冒泡到数列的一端,而快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。 Java代码实现 /** * <快速排序> * * @Author: chenxin * @Date: 2020/9/11 */ public class

陈新的博客 815
上一篇: Java线程之后台线程(守护线程)
下一篇: 算法时间度分析
zh_coder
博客等级 码龄12年 31粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值