常见算法之排序(进阶部分)_快速排序_03

采用部分快速排序算法实现数组的部分排序 采用部分快速排序算法实现数组的部分排序 Author: Eaglet     快速排序算法,网上相关文章已经介绍的很多了,数据结构教材中也有很详细的介绍。本文需要阐述的不是全排序快速排序算法,而是部分快速排序算法。所谓部分快速排序算法是指通过排序获取一个数列中最大的若干条有序记录。比如我们需要从一个有1百万记录的数组中获取前100条有序记录,并按从大到小顺序显示给用户,这种应用 阅读详情

 

public class Code_01_Sort 
{
	public static void main(String[] args) 
	{
		//初始化数组
		int len = (int)(Math.random()*20);//随机生成20以内的数组长度
		int[] arr = new int[len];
		for(int i = 0; i < len; i++)//在数组内随机生成1000内的值
		{
			arr[i] = (int)(Math.random()*1000) ;
		}
		for(int i = 0; i < len; i++)//格式化输出排序前数组
			System.out.printf("%02d:%-4d\n",i,arr[i]);
		quickSort(arr);//调用快速排序
		for(int i = 0; i < len; i++)//格式化输出排序后数组
			System.out.printf("%02d:%-+4d\n",i,arr[i]);

	}
	
	
	public static void quickSort(int[] arr)//经典快速排序,取最后一个数
	{//这个函数主要用来统一函数接口,quickSortProcess才是归并排序
		System.out.println("快速排序:");
		if(arr == null || arr.length<2)
			return;
		quickSortProcess(arr,0,arr.length-1);
	}
	
	public static void quickSortProcess(int[] arr, int l, int r)
	{//快排的思想是把数组分为三部分,小于数组最后一个元素的,等于数组最后一个元素的,大于数组最后一个元素的,然后递归下去
		if(l<r)//只要子数组的长达大于1,就递归下去
		{
			int rIndex = ((int)(Math.random()*(r-l+1)))+l;//变成随机快速排序
			int tmp = arr[rIndex];//随机选一个数与数组最后一个数交换
			arr[rIndex] = arr[r];
			arr[r] = tmp;
			
			int p[] = partition(arr,l,r);
			quickSortProcess(arr,l,p[0]-1);//递归左右两部分
			quickSortProcess(arr,p[1]+1,r);
		}
	}
	
	public static int[] partition(int[] arr, int l, int r)
	{
		int rightest = arr[r];//保存数组最右边的值
		int less = l-1;//表示小区的位置,在这个索引(包含此索引)的左边对应的值是小于数组最后一个值的。
		int more = r+1; //表示大区的位置在这个索引(包含此索引)的右对应的值是大于数组最后一个值的。
		while(l < more)//遍历数组,直到与大区相遇
		{
			if(arr[l] < rightest)//如果数组里的元素小于数组最右一个元素
			{
				int tmp = arr[l];//将该元素与小区右一位元素交换位置
				arr[l] = arr[less+1];
				arr[less+1] = tmp;
				less++;//然后小区的范围向右拓展1个位置
				l++;//继续遍历下一个元素
			}
			else if(arr[l] == rightest)//如果数组里的元素等于数组最右一个元素
				l++;//则跳过它
			else//如果数组里的元素大于数组最右一个元素
			{
				int tmp = arr[l];//将该元素与大区左一位元素交换位置
				arr[l] = arr[more-1];
				arr[more-1] = tmp;
				more--;//然后大区的范围向左拓展1个位置	
			}
		}
		return (new int[]{less+1,more-1});//返回等于区域的索引范围
	}
	
	
}

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX + CMSIS-DSP 手动添加、库添加方式 CMSIS-DSP库在工程中应用遇到的所有问题进行归纳终结 阅读详情

相关推荐

【Lane】 Ultra-Fast-Lane-Detection 复现

引言 车道线检测源码复现以及训练自己的数据集 1 环境搭建 conda create -n lane python=3.7 conda activate lane # 激活环境 conda install pytorch torchvision cudatoolkit=10.1 -c pytorch pip install -r requirements.txt 2 下载项目源码 若在服务器上可以用指令下载,否则直接在网址中下载 git clone https://github.com/cfzd/U

qq_44703886的博客 2万+

快速排序算法

文章目录一、快速排序概述1.1 什么是快速排序1.2 快速排序过程解析二、快速排序的具体步骤三、快速排序的代码实现 一、快速排序概述 1.1 什么是快速排序 快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对着两部分记录继续进行排序,以达到整个序列有序。 1.2 快速排序过程解析 假设待排序的序列为 arr[0]~arr[n-1],首先任意选取一个元素(通常选取第一个)为基准元

Ronz 的博客 5万+

用Frida-RPC搞定大麦App最新版签名:一个脚本解决x-sign和x-mini-wua

本文深入解析大麦App最新版签名机制(x-sign和x-mini-wua),详细介绍如何利用Frida-RPC技术开发稳定脚本获取签名参数。通过实战案例展示Java上下文切换、参数序列化等关键技术解决方案,为安全研究和技术验证提供可靠方案。

weixin_42525738的博客 643

常见排序算法之交换排序——冒泡排序、快速排序

​ 哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的交换排序,主要有冒泡排序,快速排序,快排分享了三种算法:挖坑法,左右指针法,前后指针法,以及两种优化方式:解决快排最坏情况的“三数取中”,避免递归次数过多的"小区间优化",包您一看就会,快来试试吧~ ​......

保护小周ღ的博客 3984

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1058

快速排序算法原理

1.快速排序算法是什么? 想必大家都学过和用过冒泡排序吧!这应该是大家成为程序员道路上学的第一个算法哦,那么我们的快速排序算法其实是在冒泡排序的基础上的一个改进,快速排序算法是利用一趟快速排序,一趟快排一般都是取第一个数作为准基数进行排序,将一串数据分成两个部分, 第一部分都比准基数小,第二部分都比准基数大,如:(-------第一部分------准基数------第二部分),也就这样以准...

Mr_xiayijie的博客 1万+

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

本教程详细介绍了如何从零开始配置QMK固件的OLED显示屏,实现个性化键盘显示。首先,文章解释了OLED显示屏的基本概念及其在键盘中的应用,并介绍了I2C和SPI两种通信方式。接着,教程逐步指导用户如何在QMK固件中启用OLED功能,包括在rules.mk中启用OLED、在halconf.h和mcuconf.h中配置I2C功能,以及在config.h中设置I2C和OLED参数。最后,教程展示了如何在keymap.c中编写代码,实现OLED显示内容,并提供了进阶定制功能,如显示当前层信息、按键状态和QMK L

Despacito0o的博客 580

排序算法之快速排序

快速排序介绍 快速排序(Quicksort)是对冒泡排序的一种改进,同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较与交换位置来达到排序的目的,不同的是,冒泡排序在每一趟只把一个元素冒泡到数列的一端,而快速排序在每一趟挑选一个基准元素,并让其他比基准元素大的元素移动到数列的一边,比基准元素小的元素移动到数列的另一边,从而把数列拆解成了两个部分,这种思路就叫做分治法 基本思想是:通过一...

花开归矣的博客 4125

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4183

Lammps实现Ar的沸腾过程(包含in文件)

Lammps实现简单的沸腾过程

Rockyoung 3503

常见排序算法:随机化快速排序算法

基本思想:在快速排序的思想上,对基数的选择采用了一个随机化的选择。 1.对于递归到某一层的数组中,在该数组中随机化选择一个数字,把数组中的数字分为两部分,比该数字小的数据都放在它的左边,比该数字大的数据都放在它的右边。 2.适用递归的思路对每次选出来的数字的左右两边进行排序。 代码: #include <iostream> #include<time.h> usi...

u011441044的博客 3107

Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

这一篇文章将采用SD卡作为存储硬件,利用SPI协议与SD卡通信,完成块设备驱动开发测试。 SD卡可以更加形象的表示块设备开发过程,明白硬件如何交互,完成数据读写。

2604

【算法】快速排序算法原理及实现

快速排序算法原理及实现

互联网小阿祥 3547

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

快速排序算法与舍伍德快速排序算法

排序算法是比较常见的算法,道理也比较简单,双指针法。今天被朋友问了个舍伍德排序算法,也是快速排序那种形式。尴尬,第一次听说,特意学了一下。结合快速排序,写了三个方法。 第一种: //不需要将基准值归位的快速排序 public static void quickSort(int []a,int left,int right) { if(left>=right) return ; int ...

大鹏视界U 3834

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

快速排序算法详解

快速排序算法详解 一、什么是快速排序算法 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。 快速排序基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。 快速排序原理: 排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数(这只是个专用名词)

qq_43660772的博客 4008

常见排序算法之快速排序

本文详细介绍了快速排序的思路、代码、优化,以及非递归版本的实现

都市隸人的博客 924

Java 快速排序算法

简介 上一章我们学习了 Java 希尔排序算法,这一章,我们来学习快速排序算法,so,多了不说,继续老规矩,学习内容如下: 1、快速排序的定义 2、快速排序的思路 3、代码实现 1.快速排序的定义 快速排序的基本思想:通过一趟排序将待排记录分隔成 独立的两部分 ,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2.快速排序的思路 快速排序使用分治法,把一个串(list)分为两个子串(child-list)具体算法描述如下: 从数列中挑出一个元素,

ZengTao 2296

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

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

b123321888的博客 1222

算法-快速排序

算法-快速排序 开始撸常用算法 理解快速排序算法 快速排序是冒泡排序的一种改进;通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列; 将画图展示快速排序算法的逻辑 有一组数据如下 这里我们将指定一个key,这个key默认可以为最后一个数据也可以为第一个数据,本分析使用的是第一个数据作为key; 为了保证key的随机性,可以生成一个left+1到right之间的

1978

Java常见排序算法详解:快速排序、插入排序与冒泡排序

我们介绍了三种常见的排序算法:快速排序、插入排序和冒泡排序。快速排序:适用于大规模数据的排序,平均时间复杂度为O(n log n),性能较优。插入排序:适用于数据量较小或接近有序的情况,简单易懂,但在大规模数据时效率较低。冒泡排序:简单易实现,但性能较差,特别是对于大量数据时,时间复杂度为O(n²)。理解这些排序算法对于编写高效的程序非常重要,尤其在处理大量数据时,选择合适的排序算法能够显著提高性能。在实际应用中,我们常常会根据数据的特点选择合适的排序方法。

2402_85834817的博客 1044

算法进阶——快速排序算法

算法进阶——快速排序算法 ​     上一篇文章的冒泡算法虽然解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了 O(N2 )。假如我们的计算机每秒钟可以运行 10 亿次,那么对 1 亿个数进行排序,桶排序只需要 0.1 秒,而冒泡排序则需要 1 千万秒,达到 115 天之久,是不是很吓人?那有没有既不浪费空间又可以快 一点的排序算法呢?那就是快速排序啦!光听这个名字是不是就觉得很高端呢? ​ ​     假设我们现在对6 1 2 7 9 3 4 5 10 8这 10

virtual_users的博客 587

Python算法之快速排序

1.快速排序算法 快排经常问:分治法(divide and conquer)就是先分再处理最后合并,快排三步走 第一步:Partition:选择基准分割数组为两个子数组,小于基准和大于基准的 第二步:对两个子数组分别快排 第三步:合并结果 分治法三步走,先分割,再递归处理,最后合并结果。 快速排序基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记...

晓康的博客 1373

排序算法-03快速排序

快速排序 文章目录快速排序1. 算法概述2. 图解3. 代码实现(挖坑填位)4. 算法优化4.1 减少因交换元素而创建临时变量4.2 优化枢轴(基准元素)的选取方式4.3 优化小数组时的排序方案4.4 参考博文 1. 算法概述 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 快速排...

taodada007的博客 642
上一篇: Java常用API 之 java.io.BufferedReader(附解析和示例)_11
下一篇: 常见算法之排序(进阶部分)_堆排序_04
coder__666
博客等级 码龄9年 42粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值