排序算法之快速排序

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

快速排序的思路如下:在待排序的数组中选择一个称为主元的元素,将数组分为两部分,使得前半部分中的所有元素都小于或等于主元,而后半部分中的所有元素都大于主元。然后分别对这两部分递归地应用此思路进行排序。


public class QuickSort {
	
	public static void sort(int[] list) {
		sort(list, 0, list.length - 1);
	}
	
	public static void sort(int[] list, int first, int last) {
		if(last > first) {
			// 1.确定主元位置
			int pivotIndex = partition(list, first, last);
			// 2.对小于主元的那一部分元素递归排序
			sort(list, first, pivotIndex - 1);
			// 3.对大于主元的那一部分元素递归排序
			sort(list, pivotIndex + 1, last);
		}
	}

	private static int partition(int[] list, int first, int last) {
		int pivot = list[first];  //选择第一个元素作为主元
		int low = first + 1;      //从左往右遍历的索引
		int high = last;          // 从右往左遍历的索引
		
		while(high > low) {
			//从左边向右边找到第一个大于主元的元素索引
			while(low <= high && list[low] <= pivot) {
				low++;
			}
			//从右边向左边找到第一个小于主元的元素索引
			while(low <= high && list[high] >= pivot) {
				high--;
			}
			//如果此时索引没有发生交叉,即左边有一个数比主元大,右边有一个数比主元小,便交换这两个数
			if(low < high) {
				int temp = list[low];
				list[low] = list[high];
				list[high] = temp;
			}
		}
		//确定主元将插入位置的索引
		while(high > first && list[high] >= pivot) {
			high--;
		}
		
		//返回主元的位置
		if(pivot > list[high]) {//主元需要移动位置,主元将数组划分为两个子数组的情况
			list[first] = list[high];
			list[high] = pivot;
			return high;
		}else {//主元不需要移动,剩余的元素全部小于(大于)主元的情况
			return first;
		}
	}

	public static void main(String[] args) {
		int[] num = {2,4,6,5,3,7,8,1};
		sort(num);
		for(int i : num) {
			System.out.print(i+" ");
		}
	}

}

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

相关推荐

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3530

以第一个数组元素作为基准元素的快速排序

/* Subject:计算机算法设计与分析 Title:2.8.1 以第一个数组元素作为基准元素的快速排序 Coder:Hao Class:计科0906 Num:0304090614 Date: Oct 2ed,2011 Programming Language:C++ */ #include using namespace std; //以第一个数组元素作为基准元素的快速排序主函数 te

翾昱 4009

matlab生成blocks、bumps和doppler标准测试信号

关键函数:wnoise使用方式X = wnoise(FUN,N) [X,XN] = wnoise(FUN,N,SQRT_SNR) [X,XN] = wnoise(FUN,N,SQRT_SNR,INIT)X = wnoise(FUN,N) 返回由 FUN给出的信号,长度为2^N,幅值范围[0,1].[X,XN] = wnoise(FUN,N,SQRT_SNR) ,返回了一个测试信号X,以及一个加噪

ZSZ_shsf的博客 6581

数组快速排序

1.快速排序,就是首先找一个基准,记作A,并且将数组中小于A的元素全部排在A的左边, 并且将数组中比A大的元素全部排在A的右边 (文中提到的“小于”,“大于”可以自行定义) 经过这样的排序,我们不用保证在A的左边和右边的元素维持着一种顺序,只要全满足小于A 和大于A即可。(这是我们下一步要进行的工作) 2.将A左边的元素,以及A右边的元素视作两个新的数组,执行1的操作,直到不可再划分 贴上快排的函数代码,自己写的,目前还没发现错误,用idea测试了一下.有错误再来改,但是快排 ...

qq_32816723的博客 4055

销售预测的方法与模型(三)丨安全库存与再订货(补货)

较高的 Z 值对应较高的服务水平(例如,服务水平 99% 对应 Z 值 2.33),意味着企业希望更低的缺货风险,因此需要更高的安全库存。在再订货点的管理中,考虑到供应商交货的不确定性,通常需要结合安全库存,以防止在交货期间库存用尽。要对L开根号,根号L表示交货周期越长,企业需要的安全库存越多,因为在较长的供应期内,需求波动的累积效应更明显。举例:供应商的交期服从标准差为2件/天的正态分布,顾客需求为50件/天的正态分布,若要客户服务水平达到 90%,安全库存量应该是多少?下面介绍几种核心的模型与公式。

weixin_45675709的博客 1535

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6558

排序算法:快速排序

快排: 快速排序:利用递归方式来实现排序 第一步:一般选取数组的第一个数作为基准,将所有数字分为两组,一组大于基准数一组小于基准数。 第二步:将分好的两组数在进行分别重新进行分组。 实现方式:将第一个数取出作为基准,从数组左端开始遍历,将查寻到的第一个小于基准数的数字放在基准数的位置并记录该数的位置(j),然后从右端开始将查询到的第一个大于基准数的数据放在(j)位,并记录该位置,然后再从(j)位开重复操作,只带两端的位置重合,此时将基准数放在该位置。 最后利用递归方式将分好的两组数重新进行上述分组。 示例

m0_50266789的博客 308

跨越移植陷阱:ESP-IDF下LVGL与ILI9341的组件化集成与常见避坑指南

本文详细解析了在ESP-IDF环境下将LVGL图形库与ILI9341显示屏驱动进行组件化集成的完整流程。重点介绍了移植过程中的关键配置策略、内存管理优化技巧以及常见问题解决方案,帮助开发者有效规避内存溢出、显示异常等典型陷阱,实现高效稳定的嵌入式GUI开发。

yhn456789的博客 623

快速排序算法

快速排序是一种基于分治策略的排序算法,其中最重要的步骤是以数组中某个元素为基准进行划分。

Anffen的博客 914

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4457

manimgl安装

安装manimgl

happytree001的博客 707

排序算法 快速排序详解

1、快速排序的简单介绍   算法思想:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换low和h...

Transkai 200

数据分析之AB测试基础知识

在 A/B 测试中,零假设是两组的指标是相同的,当假设检验推断出两组指标不同,但事实上两组指标相同时,就是第一类错误。

qq_45727498的博客 561

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

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

Ctra_aaa的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

龍弟-idea的博客 5181

OV9734 DATASHEET,完整规格书

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

Java排序算法之快速排序

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

boy_chen93的博客 1万+

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

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

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

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

b123321888的博客 1222

排序算法——快速排序

排序算法 —— 快速排序 快速排序是现在使用的很多的一种排序算法,同时也是很有可能会被面试问到的一个基础排序算法题。 那么怎么了解快速排序呢? 其实想要了解快速排序,首先我们需要知道冒泡排序,这是为啥? 这是因为快速排序是在冒泡排序的基础上的改良呀! 冒泡排序 冒泡排序的基本思想:每次都比较相邻的两个元素,如果这两个元素大小位置不对劲,那就将这两个元素的位置交换一下,这样就会使得每次都有一个符合最...

小青的博客 278

排序算法 -快速排序

排序算法-快快快速排序

shiyue 1234

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

快速排序 属于原地排序,与自顶向下归并类似的是,也是先进行大数组的排序,然后递归到小数组,在进行排序时,先选定一个元素为切分元素,按大小将其他元素放到左右两侧即可 动画演示: 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
上一篇: 排序算法之归并排序
下一篇: 类成员的修饰符权限与访问能力的关系
夜希Cc
博客等级 码龄11年 6粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值