排序算法之快速排序

目录

  • 一、简介
  • 二、代码实现
  • 三、应用场景


一、简介

算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性
快速排序O( N N N log ⁡ 2 N \log_{2}N log2N)O( N N N log ⁡ 2 N \log_{2}N log2N)O(n^2)O( log ⁡ 2 N \log_{2}N log2N)In-place不稳定

稳定:如果A原本在B前面,而A=B,排序之后A仍然在B的前面;
不稳定:如果A原本在B的前面,而A=B,排序之后A可能会出现在B的后面;
时间复杂度: 描述一个算法执行所耗费的时间;
空间复杂度:描述一个算法执行所需内存的大小;
n:数据规模;
k:“桶”的个数;
In-place:占用常数内存,不占用额外内存;
Out-place:占用额外内存。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。

快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

在这里插入图片描述

算法步驟:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

二、代码实现

public class QuickSort {public static void quickSort(int[] arr) {sort(arr, 0, arr.length - 1);}private static void sort(int[] arr, int left, int right) {if (left < right) {int pivotIdx = partition(arr, left, right);sort(arr, 0, pivotIdx - 1);sort(arr, pivotIdx + 1, right);}}private static int partition(int[] arr, int left, int right) {int idx = left + 1;for (int i = idx; i <= right; i++) {if (arr[left] > arr[i]) {swap(arr, i, idx++);}}swap(arr, left, idx - 1);return idx - 1;}private static void swap(int[] arr, int idx1, int idx2) {int tmp = arr[idx1];arr[idx1] = arr[idx2];arr[idx2] = tmp;}public static void quickSort2(int[] arr) {sort2(arr, 0, arr.length - 1);}private static void sort2(int[] arr, int left, int right) {if (left < right) {int pivotIdx = partition2(arr, left, right);sort2(arr, 0, pivotIdx - 1);sort2(arr, pivotIdx + 1, right);}}private static int partition2(int[] arr, int left, int right) {int idx = left + 1;for (int i = idx; i <= right; i++) {if (arr[left] < arr[i]) {swap(arr, i, idx++);}}swap(arr, left, idx - 1);return idx - 1;}public static void main(String[] args) {int[] arr = {12, 11, 15, 50, 7, 65, 3, 99, 0};System.out.println("---排序前:  " + Arrays.toString(arr));quickSort(arr);System.out.println("快速排序从小到大:  " + Arrays.toString(arr));quickSort2(arr);System.out.println("快速排序从大到小:  " + Arrays.toString(arr));}
}

在这里插入图片描述


三、应用场景

优点

通常明显比其他 Ο(n log n) 算法更快。
内循环较小,快速排序通常内循环较少。
是一种分治算法。
是递归的。
是原地的。
不需要额外的存储。

缺点

快速排序的最差时间复杂度是 Ο(n²)。
快速排序是不稳定的。
快速排序的空间复杂度是 Ο(log n)。
快速排序的递归深度是 Ο(log n)。
快速排序的运行时间取决于分区的方式。

常见应用场景

快速排序被广泛应用于各种应用中,例如对大型数据集进行排序、实现高效的排序算法、优化算法性能等。
它也用于各种数据结构,如数组、链表和集合,以高效地搜索和操作数据。
快速排序也用于各种排序算法中,例如堆排序和归并排序,作为数据分区的子例程。
快速排序也用于图遍历的各种算法中,如深度优先搜索和广度优先搜索,以高效地访问图中的所有节点。


参考链接:
十大经典排序算法(Java实现)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HLOOKUP函数结合数据验证实现的动态图表

小伙伴们&#xff0c;大家好啊&#xff01;今天我们分享一个使用HLOOKUP函数结合数据验证实现的动态图表技巧&#xff1b; 接下来我们具体说说操作步骤吧。 步骤1&#xff1a;选中A列的【路口车辆通过数】单元格区域&#xff0c;复制粘贴后到右边的空白区域&#xff0c;如I列…

加权 [Picard皮卡尔法 ](或非加权)最小二乘相位解包裹-matlab

phase_unwrap.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 根据Ghiglia和Romero(1994)提出的方法,基于加权和非加权最小二乘法进行相位解包裹 % 链接:https://doi.org/10.1364/JOSAA.11.000107 % 输…

【ArcGIS Pro二次开发】(85):Aspose.Cells中的Excel操作

Aspose.Cells是一款功能强大的Excel文档处理和转换控件&#xff0c;开发人员和客户电脑无需安装Microsoft Excel也能在应用程序中实现类似Excel的强大数据管理功能。 1、获取工作薄Workbook string excelFile "C:\Users\Administrator\Desktop\FE.xlsx"; Workbook …

日志数据采集存储

海量日志采集 在业务高峰期下&#xff0c;会有同时成千上万个客户端建立连接&#xff0c;实时上报日志数据。 在上面的高峰期场景下&#xff0c;日志采集服务会有不小的压力&#xff0c;如果程序代码逻辑处理稍有不当&#xff0c;就会造成服务卡顿、CPU 占用过高、内存溢出等…

数组(java)

目录 数组的定义和使用&#xff1a; 数组的初始化&#xff1a; 遍历数组&#xff1a; 数组是引用类型 初始JVM的内存分布 再读引用变量 认识null 数组的应用场景 作为函数的参数 作为函数的返回值 数组练习 数组转字符串 排序 冒泡排序 数组逆序 数组求平均…

代码随想录-算法训练营day07【哈希表02:四数相加、赎金信、三数之和、四数之和】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第三章 哈希表part02 今日任务 ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结 详细布置 454.四数相加II 建议&#xff1a;本题是 使用map 巧妙解决的问题&#xff0c;好好体会一下 …

tsReact 创建项目

全局安装create-react-app 脚手架 npm install -g create-react-app 或者 yarn add -g create-react-app初始化项目 $ npx create-react-app demo --template typescriptnpm run eject 释放配置文件 通过脚手架创建完项目后&#xff0c;会发现没有任何 配置文件&#xff08;…

C++| QT自定义信号和槽

前言&#xff1a;之前学习QT都是使用自带的信号进行槽函数触发&#xff0c;一直没有找到需要使用自定义信号的场景&#xff0c;但最近读QT项目代码的时候&#xff0c;应用到了自定义信号&#xff0c;所以特地写这篇总结一下。 QT自定义信号和槽 信号和槽为什么要自定义信号如何…

CSRF漏洞初解

CSRF漏洞初解 1.什么是CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff09;漏洞是一种Web应用程序安全漏洞&#xff0c;也被称为"One-Click Attack"或"Session Riding"。它利用了Web应用程序对用户在其他网站上已经验证过的身份的信任&…

数据——关键生产要素

数据作为数字经济时代的关键生产要素&#xff0c;逐步融入生产生活各方面&#xff0c;深刻影响并重构着经济社会运行和社会治理&#xff0c;已成为影响未来发展的关键战略性资源。近年来&#xff0c;我国高度重视发展数字经济、数据要素及其市场化配置改革&#xff0c;发布了一…

多模态对齐方案

最全 LMM 模型结构&#xff08;13种&#xff09;综述本文中我们介绍了 13 中常见的大型多模态模型&#xff08;Large Multimodal Models, LMM&#xff09;&#xff0c;包括 BLIP-2&#xff0c;LLaVA、MiniGPT、Qwen-VL 以及 Ferret 等。https://mp.weixin.qq.com/s/EnK7F0yPYmX…

C语言入门(第二天:判断、循环)

一、基础语法 1.1 位运算符(&#xff01;&#xff01;重点) 运算符术语示例结果&按位与011 & 1012个都为1才为1&#xff0c;结果为001|按位或011 & 101有1个为1就为1&#xff0c;结果为111^按位异或011 ^ 101不同的为1&#xff0c;结果为110~取反011100<<左…

使用Python实现自动化网页答题功能-模拟考试篇

介绍 在驾驶员考试网站上进行模拟考试python自动答题 自动化原理 该脚本使用了自动化模块 DrissionPage 中的 ChromiumPage 类来实现网页的自动化操作。通过定位网页元素和模拟点击操作&#xff0c;完成了选择答案和提交答卷的过程。 用途与注意事项 用途&#xff1a;该脚本…

LLM推理框架Triton Inference Server学习笔记(二): Triton模型部署流程(stey by stey)

官方文档查阅: TritonInferenceServer文档 1. 写在前面 上一篇文章对triton inference server进行了一个整体的介绍&#xff0c;解答了三个经典问题what, why, how。 这篇文章就开始转入实践&#xff0c; 从实践的角度整理Triton模型部署的全流程&#xff0c; 如果我有一个训…

系统架构最佳实践 -- 卡券系统架构设计

目录 1.卡券类型的设计&#xff1a; 2.用户领取和使用流程&#xff1a; 3.卡券发放与管理&#xff1a; 4.卡券核销与统计&#xff1a; 5.安全性和防欺诈&#xff1a; 随着电子商务的迅速发展&#xff0c;卡券系统成为了各种商家吸引用户和促销的重要手段。在设计和实现卡券…

分享一个预测模型web APP的功能模块和界面的设计

一个临床预测模型web APP功能模块与界面设计 随着医疗技术的不断进步&#xff0c;web APP是临床预测模型在医学领域的应用的重要形式。这里分享一个web APP的设计&#xff0c;手里有医学预测模型的可以尝试将其构建成webAPP&#xff0c;进而在临床实践中体验预测模型带来的便利…

【Druid】数据库连接超时

现象&#xff1a; 接口请求&#xff0c;10秒钟超时&#xff0c;看了一下&#xff0c;是sql查询耗时太长了&#xff0c;数据还没来得及返回&#xff0c;连接就断开了。 连接断开&#xff0c;上层应用直接报错。。 这些问题&#xff0c;都是。。。知道答案后&#xff0c;就觉得&…

CTF工具下载(1)----随波逐流

为什么要写这个博客喃&#xff0c;因为随波逐流每隔一段时间就会更新&#xff0c;要下载最新版本才能用&#xff0c;但是每次都会有点麻烦&#xff0c;所以写一个博客记录下。 1.进入官网&#xff0c;点击 2.进入城通网盘 3.进入编码工具 4.点击最新版本的随波逐流就下载了&am…

在Mac主机上连接Linux虚拟机

前言 最近醉心于研究Linux&#xff0c;于是在PD上安装了一个Debian Linux虚拟机&#xff0c;用来练练手。但是每次在mac和Linux之间切换很是麻烦&#xff0c;有没有一种方法&#xff0c;可以在mac终端直接连接我的虚拟机&#xff0c;这样在mac终端上就可以直接操控我的Linux虚…

咸鱼之王_手游_开服搭建架设_内购修复无bug运营版

视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…