java 快速排序 时间复杂度 空间复杂度 稳定性

深入理解快速排序:JAVA实现与应用 在排序算法中,稳定性是指在排序后,具有相等键值的元素之间的相对次序与排序前相同。 阅读详情

 1、快速排序的基本思想:

         通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

       先看一下这幅图:


把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。


2、java代码:

</pre><pre name="code" class="java">package com.ynu.www.tool;

public class QuickSort {

	public int getMiddle(int[] arrayInt, int low, int high) {
		int tmp = arrayInt[low];

		while (low < high) {

			while (low < high && tmp < arrayInt[high]) {
				high--;
			}
			arrayInt[low] = arrayInt[high];// 比中轴小的记录移到低端

			while (low < high && arrayInt[low] < tmp) {
				low++;
			}
			arrayInt[high] = arrayInt[low];
		}
		arrayInt[low] = tmp;

		return low;
	}

	public void quicksort(int[] arrayInt, int low, int high) {
		if (low < high) {
			int mid = getMiddle(arrayInt, low, high);
			quicksort(arrayInt, low, mid);
			quicksort(arrayInt, mid + 1, high);
		}
	}

	public static void main(String args[]) {
		QuickSort qs = new QuickSort();
		int[] testArray = { 34, 3, 53, 2, 23, 7, 14, 10 };
		qs.quicksort(testArray, 0, testArray.length - 1);
		for (int i = 0; i < testArray.length; i++) {
			System.out.print(testArray[i] + " ");
		}
	}

}


3、算法分析:

平均时间复杂度O(nlogn),最坏时间复杂度O(n*n),辅助空间O(logn)<每次都要分给一个额外空间,而总共有logn次> 
每次分成两段,那么分的次数就是logn了,每一次处理需要n次计算,那么时间复杂度就是nlogn了! 
根据平均情况来说是O(nlogn),因为在数据分布等概率的情况下对于单个数据来说在logn次移动后就会被放到正确的位置上了。 
最坏是O(n^2).这种情况就是数组刚好的倒序,然后每次去中间元的时候都是取最大或者最小。

稳定性:不稳定。


4、补充说明:

1、时间复杂度 
(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 
(2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。 
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。 按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。 2、空间复杂度 与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n)) 我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。讨论方法与时间复杂度类似,不再赘述。 
(3)渐进时间复杂度评价算法时间性能   主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。

2、类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。 
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地/"进行的,是节省存储的算法,如这一节介绍过的几个算法都是如此;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如将在第九章介绍的快速排序和归并排序算法就属于这种情况。

如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。


实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例 本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。 阅读详情

相关推荐

K2P padavan固件下宽带与IPTV融合

举例说下,假如你的IPTV是拨号的,IPTV端口直接连到笔记本电脑的网口,IP是自动分配的情况下,在VLC里面是可以直接播放“rtp://239.XXX.XXX.XXX:XXXX”的,即使IPTV是DHCP模式,按道理也是可以播放的。家里很少看电视,基本上就是看看春晚,然后平时老人在家没事看看,所以就把广电的机顶盒停掉了,换了一个N1的盒子刷了CoreELEC系统,既可以通过m3u8文件看网络电视,也可以看本地的多媒体,很方便,完全满足了自己的需求。在上图的第三步中,端口设置成大于1024的端口即可。

aplsc的专栏 63万+

快速排序空间复杂度( O(logn)-O(N))

每次递归所需要的空间大小都是一样的而且就算是第N次递归,每次递归所需的栈空间也是一样的,所以每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是O(1)非顺序:空间复杂度=深度:O(lonN)每次递归所需的空间都被压到调用栈里(顺序:空间复杂度=深度:O(N)1.不理解快速排序,看这篇博客。),所以快速排序的空间复杂度就是。2.快排的空间复杂度。

m0_72964546的博客 1万+

FPGA矩阵键盘计算器Verilog实现与Quartus仿真全流程解析

本文详细解析了基于FPGA和Verilog的矩阵键盘计算器实现全流程,包括矩阵键盘扫描、状态机设计、算术运算逻辑及数码管显示驱动。通过Quartus仿真与Testbench测试,确保设计稳定性与准确性,适合数字逻辑设计初学者学习FPGA开发与硬件描述语言应用。

chair的专栏 742

算法基础:排序

基本概念 排序,就是让一组无序数据变成有序的过程。 衡量一个排序算法的优劣,主要从以下 3 个角度进行分析: 时间复杂度。具体包括:最好时间复杂度、最坏时间复杂度以及平均时间复杂度。 空间复杂度。如果空间复杂度为 O(1),就叫作原地排序。 稳定性。排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。 常见的排序算法及其思想 冒泡排序 public static void main(String[] args) { int[] arr = { 1, 0, 3, 4, 5,

qq_40286307的博客 831

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

qq_45634989的博客 2877

PyTorch实战:5步搞定QAT量化感知训练(附避坑指南)

本文详细介绍了在PyTorch中实施量化感知训练(QAT)的五步实战流程。通过环境准备、模型融合、伪量化节点与STE原理剖析、校准微调训练、模型转换与导出等步骤,帮助开发者有效压缩模型以适配移动端与边缘设备部署,并提供了关键的超参数设置与常见问题避坑指南。

weixin_29083373的博客 417

快速排序算法详解(原理,时间复杂度,实现代码)

快速排序只是使用数组原本的空间进行排序,所以所占用的空间应该是常量级的,但是由于每次划分之后是递归调用,所以递归调用在运行的过程中会消耗一定的空间,在一般情况下的空间复杂度为 O(logn),在最差的情况下,若每次只完成了一个元素,那么空间复杂度为 O(n)。此时以基准数6为分界点,6左边的数都小于等于6,6右边的数都大于等于6。快速排序是在冒泡排序的基础上改进而来的,冒泡排序每次只能交换相邻的两个元素,而快速排序是跳跃式的交换,交换的距离很大,因此总的比较和交换次数少了很多,速度也快了不少。

lmdanran的博客 1万+

ESP-Mesh-Lite vs ESP-Mesh:如何选择适合你的物联网组网方案?

本文深入对比了乐鑫ESP-Mesh-Lite与ESP-Mesh两种物联网组网方案的核心差异。重点解析了ESP-Mesh-Lite分布式协议栈架构的优势,即每个节点拥有独立IP,可直接访问外部网络,极大简化了应用层开发。文章从网络架构、性能、开发体验及适用场景等多维度进行分析,为开发者根据项目需求(如分布式数据采集、智能家居或集中控制网络)选择最合适的方案提供了清晰的决策框架。

pluto的博客 815

快速排序的空间复杂度|数据结构

空间复杂度 最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况 最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况 首先就地快速排序使用的空间是O(1)的,也就是个常数级; **而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据;** #快速排序 int Partition(int R,int low,int high) { int i...

资资的博客 1万+

XGBoost的简单安装及入门使用

XGBoost安装及简单入门 XGBoost支持多种操作系统,如Windows, Linux, MacOS等,并支持多种语言版本,如Python, R, Scale, Java等。XGBoost的安装方式一般有两种,一种是直接通过pip安装(适合用于Python),另外一种是通过源码编译安装 1、通过pip安装 通过pip安装Python包既简单又方便,只需执行如下的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost 使用

qq_41513230的博客 3万+

VMware下载与安装

一、VMware下载 二、VMware安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 313

程序猿修仙之路--算法之快速排序到底有多快

快排 天下武功,唯快不破!!外功如此,内功亦是如此。今日我们来修炼一门比较快速的排序算法-快速排序。快速排序流行的原因是它实现简单,并且在多数应用中比其他排序算法快的多。 习练快速排序,先要了解如下两个概念: 分治思想 ...

weixin_30787531的博客 337

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

java 数组时间换空间_java 快速排序 时间复杂度 空间复杂度 稳定性

转自:http://blog.youkuaiyun.com/believejava/article/details/38434471——————————————————————————————————————————————1、快速排序的基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。先看一下这幅图:把整个序列看...

weixin_34226837的博客 171

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

插入、冒泡、归并、快排时间复杂度和空间复杂度

排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 插入排序 O(n2) O(n2) O(n) O(1) 稳定 简单 冒泡排序 O(n2) O(n2) O(n) O(1) 不稳定 较复杂 归并排序 O(nlog2n) O(nlog2n) O(nlog2n) O(n) 稳定 较复杂 快速排序 O(nlog2n) O(n2) O(nlog2n) O(nlog2n) 不稳定 较复杂 1. 插入排序 /** * 插入排序的 ...

Zmd_23的博客 5726

IDEA的使用指南

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

快速排序Java多种方法_快速排序的java实现

简介快速排序,看这名字就知道这是一种很快的排序方法,实际上也是如此。快速排序属于分治法的一种,就是说通过把数据分成几部分来同时处理的一种算法。这种算法很重要,所以研发岗的面试经常考。快速排序的步骤我们以数组int[]a={7,5,3,2,9,10,8,4,6,1};这个数组为例来说明一下快速排序到底是怎么进行的。第1步:找基准值所谓的基准值,顾名思义就是以它为基准进行比大小。通常来说,我们选取数组...

weixin_30366435的博客 240

快速排序(Java)

目录1、原理2、实现3、性能指标 1、原理 (1)从待排序区间选择一个数,作为基准值; (2) Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边,不断递归,直至数据完全有序 2、实现 (1)手动实现 (2)代码 import java.util.Arrays; public class Quick { public static void quickSort(int[] array){ /

zz070的博客 293

快速排序---优秀的讲解

1. 经典快速排序图示过程 (1) 经典快速排序的总体流程 (2) 根据基准值分区的过程 在[算法题] 荷兰国旗问题中有详细的介绍。 2. 随机快速排序 经典快速排序总是指定数组或者某部分的最后一个元素作为基准值,随机快速排序指定数组或者某一部分中的随机值作为基准值。 3. 动图展示 quickSort.gif 4. 随机快速排序Java代码实现 /** * 快速排序...

运动中的石头 213

JAVA实现快速排序

JAVA实现快速排序 1. 快速排序基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 2. 算法分析 时间复杂度 最好情况:O(nlogn) 最坏情况:O(n2) 平均情况:O(nlogn) 空间复杂度: O(logn) (栈占用的空间) 稳定性: 不稳定 3.个人觉得难点 快速排序里的递归:递归就是方法调用自己 方法中有if语句满足了这个条件才会

L19iii的博客 540

快速排序(Quick Sort)

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地...

chunbixi5712的博客 154

常见排序算法JAVA版代码时间复杂度空间复杂度稳定性(标准命名及标准写法)

常见排序算法0、概述0.1、排序的稳定性0.2、排序的分类0.3、排序的性能评价0.4、总体比较1、插入排序1.1、直接插入排序1.2、希尔排序2、交换排序2.1、冒泡排序2.2、快速排序3、选择排序3.1、简单选择排序3.2、堆排序 0、概述 0.1、排序的稳定性 当待排序列关键字各不相同时,排序结果唯一,否则结果不唯一。在待排序列文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则该方法是稳定的。 0.2、排序的分类 内部排序和外部排序,此处只讨论内部排序 内

qq_45566354的博客 794

快速排序-java

快速排序 快速排序: 快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 视频链接 /* 基本思想: 通过一趟排序把要数据分隔成独立的2部分,其中一部分的所有数据比另一部分的所有...

mym_74的博客 147

快速排序

1. 快速排序 1.1 排序原理 在数组中找一个分界元素,将数组分为两个区间,小于分界元素的全部放在分界元素之前,其他的放在分界元素之后; 在分出来的两个区间(不包括分界元素)重复上述过程,直到区间缩小为1; 1.2 性能分析 1.2.1 执行效率 最好情况时间复杂度:数据每次分为对等的两个区间,时间复杂度是O(n log n); 最坏情况时间复杂度:数据完全有序,每次元...

weixin_30426957的博客 93

排序算法----三路快速排序

1. 快速排序:快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比一部分的关键字小,比另一部分的关键字大,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2. 三路快速排序的时间,空间复杂度及稳定性: 1>. 时间复杂度:O(nlogn);因为我们这里三路快速排序的过程中向下递归分割数组的过程时间复杂度为:O(logn);我们在划分数组部分的时候还要遍历数组,时间复杂度为:O(n);因此三路快速排序的时间复杂度为:O(nlogn)。 ...

NancyLCL的博客 2070

比较排序——三路快速排序

三路快排

m0_58679504的博客 1035
上一篇: java 一行行读取写入txt文档
下一篇: 剑指offer算法 java实现 单例模式
黄玮鹏
博客等级 码龄17年 262粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值