快速排序 暑假补习之排序算法

【排序算法】快速排序原理及Java实现 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下: 阅读详情

按照排序算法的实用分析,快速排序也许是性能最高的一种排序算法了。

1. 简单complexity分析

时间复杂度O(nlogn)

最坏情况O(n^2) :如果pivot的选择不恰当的话。 当然看过博客写过实际环境中,选pivot可选第一个元素,也可随机选择,也可以规律选择,比如在头尾以及中间元素间选择,我个人的观点是按实际情况分析,因为我理解的程序不是照搬,数据结构和算法都千变万化,只选择最适合当前的情况的最符合自己思维习惯的即可,当然要符合bug free的规律。

空间复杂度O(nlogn)

2. 不稳定排序

按照WIKI的解释,不稳定排序是在两个或多个相等元素在排序之后,可使相对位置发生改变的一种排序。不稳定排序算法的种类比较多,知道稳定排序的基本排序算法即可。如下:

冒泡排序(BubbleSort) 插入排序(Insertion Sort) 归并排序(MergeSort)基数排序(Radix Sort)

3.  快速排序主要思想

当我前期学习快速排序时,非常迷惑,后来知道一个原理就是小的放在pivot左边,大的放在pivot右边。当然这只是快速排序的一个步骤,就是选择分割点。那么分治算法的“分”的第一步就在这里实现。那么选择pivot是个仁者见仁的事情了,可根据需求进行分析,哪里选择pivot是可以对程序运行质的提高的。pivot的移动主要就是通过交换,一步步的交换会把pivot放在最终位置,那个位置就是分割点,左边的是小的,右边的值比分割点大。

4. 基本代码:

基本流程:

public static int[] quickSort(int[] test, int low, int high){
		if(low < high){
			int pivot = getPivot(test,low,high);//得到pivot
			quickSort(test,low, pivot-1);//递归排序pivot左边数据
		   	quickSort(test,pivot+1,high);//递归排序pivot右边数据
		}
		return test;

获取Pivot的代码:

//version 1: 此代码思想是借鉴网友的,并非我自己写的,特此标注。

public static int getPivot(int[] array, int start, int end  ){
		int key = array[start];
		while(start < end){
			while(start < end && array[end]  >= key) 
				end --;
			array[start] = array[end];
			while(start < end && array[start] <= key )
				start++;
			array[end] = array[start];
		}
		array[start] = key;
		return start;
		}
	}

//version2:
// 这段代码是按照自己的理解写的,看起来sloppy。 留下来给自己 做耻笑状 之用。

public static int partition(int[] test, int low, int high){
		int key = test[low];
		int tmp =0;
		while(low<high){
			while(test[high] >= key && low<high) high--;
				if(test[high] < key) {
				tmp = test[high];
				test[high] = test[low];
				test[low]= tmp;
				low ++;
			}
			
			while(test[low]<=key && low <high)				
			 low++;
			 if(test[low] > key){
				tmp = test[high];
				test[high] = test[low];
				test[low]= tmp;
				high--;
			}
		}
		return low;
	}


5. 综合排序算法分析,请参考:
这篇文章写的比较详尽:
http://www.cnblogs.com/ziyiFly/archive/2008/09/10/1288516.html
(本文是本人暑假补习记录,写的不好,欢迎大家吐槽,写的不对,欢迎大家指正)





        
七大排序算法之快速排序 七大排序算法之快速排序七大排序算法之快速排序 快速排序的介绍 快速排序的核心思想 简单例子 时间复杂度的讨论 每轮快排的具体实现 代码 快速排序的介绍:快速排序是C. A. R. Hoare在1962年提出的,平均时间复杂度为O(nlogn)级的高效率算法,也是目前O(nlogn)的排序算法中使用最多的算法,这段时间想把自己学过的算法都整理一遍,于是就写了这篇博客,来记录自己的学习过程吧…也希望能给 阅读详情

相关推荐

PCL 计算USC并可视化【2025最新版】

计算USC特征描述并可视化

点云侠的博客 1236

USC算法实验1 勇者斗恶龙

在很久很久以前,地上有一个荣光的王国,在这个王国里,国民安居乐业,国王开明勤政。但是突然有一天,有一群恶龙入侵了这个美丽的国家。恶龙们一路杀到了这个国家的首都,王国岌岌可危。 在这个生死攸关的时刻,王国的总共 个勇者们聚集到了首都,在他们当中第 个勇者的能力值为 ,这代表这个勇者能够对恶龙造成 点伤害或者防御住恶龙 的攻击。 与此同时,王国的勇士们获得了恶龙们的情报:在城外总共有 条恶龙,第 条恶龙的防御力为 ,攻击力为 。幸运的是,恶龙们每次只会有一条来进攻首都。并且进攻的顺序...

wjz0626的博客 613

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 724

经典排序算法之:快速排序

  快速排序可能是应用最广泛的排序算法。快速排序流行的原因是它实现简单、适用于各种不同的输入数据且在一般应用中比其他排序算法都要快很多。此次,我们来学习一下快速排序算法。 一、快速排序算法含义   快速排序是一种分治的排序算法。它会在数组中选择一个基准元素,讲数组分为两部分,使得第一部分中的所有元素都小于或等于基准元素,而第二部分中的所有元素都大于基准元素。对第一部分和第二部分递归的应用快速排序算法。 二、快速排序算法过程 例如:   对数组 [5 2 9 3 8 4 0 1 6 7 ]进行快速排序   

Ctra_aaa的博客 1万+

机器人控制入门

机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位

彼岸花 1万+

保姆级教程:用Docker快速部署mpromonet/webrtc-streamer实现WebRTC直播(附常见问题解决)

本文提供了一份详细的Docker部署mpromonet/webrtc-streamer的实战指南,帮助用户快速搭建WebRTC直播服务。内容涵盖从环境准备、基础部署到进阶配置与性能调优的全过程,并针对容器网络、视频流配置、跨网访问等常见问题提供了解决方案,旨在实现低延迟的流媒体传输。

dell8的博客 177

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

快速排序是对冒泡排序的一种改进。 快速排序原理 1.首先设定一个分界值,通过该分界值将数组分成左右两部分﹔ 2.将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值; 3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 4.重复上述过程,可以看出,这是一个递归定义。通过递归将

龍弟-idea的博客 5181

基于Python的信用卡欺诈检测机器学习案例报告

当今时代,在线支付已成为一种高效便捷的支付方式,我们可以突破时间和空间的限制,输入我们的信用卡各项信息就可以完成在线支付。但随之而来的是这种支付方式也具备一定的风险性,我们无法辨别对方是否是恶意套取我们资金的非法分子。当信用卡信息数据泄露导致金钱失窃并最终失去客户忠诚度和公司声誉时,组织、消费者、银行和商家都会面临风险。2017 年,未经授权的信用卡操作达到了惊人的 1670 万受害者。此外,据美国联邦贸易委员会 (FTC) 报告,2017 年信用卡欺诈索赔数量比上一年高出 40%。

weixin_45673389的博客 6694

排序算法之快速排序

超详细的快速排序算法~

ZhangYu_010228的博客 1757

华为擎云W515 PGUV-WBY0安装银河麒麟V10全流程解析

本文详细解析了华为擎云W515 PGUV-WBY0安装银河麒麟V10系统的全流程,包括准备工作、镜像下载与校验、启动盘制作、BIOS设置、安装过程关键选择、系统初始化及常见问题排查。特别针对ARM架构设备提供了实用技巧,帮助用户顺利完成国产化系统的部署与优化。

weixin_28725949的博客 698

KV Cache 详解:新手也能理解的 LLM 推理加速技巧

(Autoregressive)生成的,即每次生成一个 token,然后将其作为输入继续生成下一个 token。:如果序列太长,超过了 KV Cache 的存储限制,就需要丢弃最早的 tokens(类似滑动窗口)。时,每次只会生成一个新 token,然后再把这个 token 作为输入继续生成下一个 token。,只缓存计算过的 K,VK, V,每次只计算新 token 的 K,VK, V,从而提升推理效率。:如果输入的 prompt 发生变化,之前的 KV Cache 不能复用,必须重新计算。

Harry的博客 7360

双路快速排序和三路排序算法

三路快速排序是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v,等于 v,大于 v,v 为标定值,这样三部分的数据中,等于 v 的数据在下次递归中不再需要排序,小于 v 和大于 v 的数据也不会出现某一个特别多的情况),通过此方式三路快速排序算法的性能更优。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对。我们可以使用本教程的归并思想求逆序对的数量。

b123321888的博客 1222

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1427

排序算法 -快速排序

排序算法-快快快速排序

shiyue 1234

猫群优化算法(CSO)详解:从生物灵感到智能优化

猫群优化算法(CSO)是一种模拟猫科动物行为的群体智能优化算法。该算法基于猫的两种主要行为模式:搜寻状态(全局探索)和跟踪状态(局部开发)。CSO通过混合率(MR)动态调整两种模式的比例,实现探索与开发的平衡。算法核心包括搜寻模式的变异操作和跟踪模式的速度-位移模型,具有收敛性能好、全局搜索能力强等特点。相比传统优化算法,CSO在高维复杂问题中表现优异,已成功应用于函数优化、图像处理等多个领域。算法性能受混合率、变化域等参数影响,自适应参数策略可进一步提升优化效果。

qq_42212808的博客 618

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

Morty的技术乐园 6482

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

排序算法——快速排序.net实现

排序算法——快速排序.net实现基本思想算法图例编码实现总结分析 基本思想 通过一趟排序将要排序的数据分割成独立的两个部分,一部分的所有数据都比另一部分所有的数据都要小,然后按照此方法对这两部分的数据分别进行快速排序,整个排序的过程可以递归进行,以此将整个数据变成有序的序列。 算法图例 假如我们现在要对“6 1 2 7 9 3 4 5 10 8” 这10个数进行排序,在上一篇中我们采用冒泡排序将相...

Leaderxin的博客 5280

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

排序算法之快速排序、堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆(Heap)是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。一般情况,将堆顶元素为最大值的叫做“大顶堆”(Max Heap),堆顶为最小值的叫做“小顶堆”。算法简单来说,就是构建一个大顶堆,取堆顶元素作为当前最大值,然后删掉堆顶元素、将最后一个元素换到堆顶位置,进而不断调整大顶堆、继续寻找下一个最大值。

花&败 2387

【排序算法之快速排序】

本期我们学习排序算法中的快速排序,会着重讲解算法的核心思想、时空复杂度分析以及代码的实现。

wddkxg的博客 765

快速排序:一种高效的排序算法

排序是最基本和最常用的操作之一。无论是数据处理、搜索优化,还是各种应用程序的内部逻辑,排序算法的选择都直接影响到程序的性能。快速排序(Quick Sort)作为一种典型的分治算法,以其平均时间复杂度 O(n log n) 和优越的实际表现,成为了现代编程中最常用的排序算法之一。本篇博客将详细讲解快速排序。快速排序是一种非常高效的排序算法,特别适合于大规模数据集的排序。虽然最坏情况的时间复杂度为O(n²),但通过优化基准元素的选择方法,快速排序在实际应用中常常表现得非常优秀。

2302_79376097的博客 1761

【十大排序算法】快速排序

在乱序的世界中,快速排序如同一位智慧的园丁, 以轻盈的手法,将无序的花朵们重新安排, 在每一次比较中,沐浴着理性的阳光, 终使它们在有序的花园里,开出绚烂的芬芳。

DC1020的博客 1250

快速排序算法详解与其他排序算法的比较

快速排序 属于原地排序,与自顶向下归并类似的是,也是先进行大数组的排序,然后递归到小数组,在进行排序时,先选定一个元素为切分元素,按大小将其他元素放到左右两侧即可 动画演示: P为切分元素 L为左标记 R为有标记 package Sort; import edu.princeton.cs.algs4.StdRandom; import static Sort.SortExample.*; import static edu.princeton.cs.algs4.StdRandom.unifo

qq_45921491的博客 1033

排序算法之--快速排序

快速排序  分而治之方法还可以用于实现另一种完全不同的排序方法,这种排序法称为快速排序(quick sort)。在这种方法中, n 个元素被分成三段(组):左段l e f t,右段r i g h t和中段m i d d l e。中段仅包含一个元素。左段中各元素都小于等于中段元素,右段中各元素都大于等于中段元素。因此l e f t和r i g h t中的元素可以独立排序,并且不必对l e f t和r

ehxe Asp.Net&PHP 1万+

Java排序算法之快速排序

        快速排序,顾名思义,速度快;其时间复杂度为(NlogN),那么它是如何运作来实现高速排序的呢?先讲一下它的基本原理:         (1)寻找到一个枢纽元,也就是在一组元素中找一个元素(怎么找是有讲究的);         (2)然后在这组元素中,比这个枢纽元小的放在左边,比其大的放在右边;         (3)然后对左右重复上述两步,即可实现从小到大排序;      ...

boy_chen93的博客 1万+
下一篇: 关于堆排序建堆时间以及堆排序的分析之暑假学习记录
usc_su
博客等级 码龄14年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值