java算法:快速排序

快速排序是一种常用的排序算法,它利用分治的思想将一个数组分成两个子数组,然后递归地对子数组进行排序,最终将整个数组排序完成。

快速排序的基本思想如下:

  1. 选择一个基准元素(pivot),通常选择数组的第一个或最后一个元素。
  2. 将数组分成两个部分,使得左边的元素都小于等于基准元素,右边的元素都大于基准元素。这个过程称为分区(partition)。
  3. 对左右两个部分分别递归地进行快速排序。
  4. 合并左右两个部分,得到最终的排序结果。

以下是用Java实现快速排序的示例代码:

public class QuickSort {public static void quickSort(int[] arr) {quickSort(arr, 0, arr.length - 1);}private static void quickSort(int[] arr, int low, int high) {if (low < high) {// 分区操作,返回基准元素的最终位置int pivotIndex = partition(arr, low, high);// 递归排序基准元素左边的子数组quickSort(arr, low, pivotIndex - 1);// 递归排序基准元素右边的子数组quickSort(arr, pivotIndex + 1, high);}}private static int partition(int[] arr, int low, int high) {// 选择最后一个元素作为基准元素int pivot = arr[high];// 比基准元素小的元素的最终位置int i = low - 1;for (int j = low; j < high; j++) {// 如果当前元素小于等于基准元素,则将其放到小元素区域的末尾if (arr[j] <= pivot) {i++;swap(arr, i, j);}}// 将基准元素放到最终位置swap(arr, i + 1, high);// 返回基准元素的最终位置return i + 1;}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {int[] arr = {4, 2, 6, 8, 3, 1, 5, 7};quickSort(arr);System.out.println("Sorted array:");for (int num : arr) {System.out.print(num + " ");}}
}

在上述代码中,quickSort()方法是快速排序的入口方法,它调用了私有的辅助方法quickSort()和partition()。quickSort()方法通过递归调用对子数组进行排序,而partition()方法用于将数组分区并返回基准元素的最终位置。

可以看到,快速排序算法成功地对数组进行了排序。快速排序的平均时间复杂度为O(nlogn),其中n是数组的长度。

快速排序的优点:

  • 高效:快速排序的平均时间复杂度为O(nlogn),其中n是数组的长度,是一种较快的排序算法。
  • 原地排序:快速排序使用了原地排序,不需要额外的空间来存储临时数据,只需要对数组进行原地交换操作。 快速排序的缺点:

快速排序的缺点:

  • 不稳定性:在分区过程中,相同元素的相对顺序可能会改变,因此快速排序是一种不稳定的排序算法。
  • 对于特定的输入情况,快速排序的性能可能会下降。当输入数组已经有序或近乎有序时,快速排序的时间复杂度会退化到O(n^2),其中n是数组的长度。为了避免这种情况,可以采用一些优化技巧,如随机选择基准元素或使用三数取中法来选择基准元素。

随机选择基准元素

  • 在每次分区之前,随机选择数组中的一个元素作为基准元素。
  • 这样可以降低出现最坏情况的概率,使得快速排序的期望时间复杂度更接近O(nlogn)。
private static void quickSort(int[] arr, int low, int high) {if (low < high) {// 随机选择基准元素int randomIndex = low + new Random().nextInt(high - low + 1);swap(arr, randomIndex, high);// 分区操作,返回基准元素的最终位置int pivotIndex = partition(arr, low, high);// 递归排序基准元素左边的子数组quickSort(arr, low, pivotIndex - 1);// 递归排序基准元素右边的子数组quickSort(arr, pivotIndex + 1, high);}
}

三数取中法选择基准元素

  • 从待排序数组的起始、中间和末尾位置各选取一个元素。
  • 对这三个元素进行排序,并选择其中位于中间位置的元素作为基准元素。
  • 这样可以尽量选择一个接近中间值的元素作为基准元素,减少最坏情况的概率。
private static void quickSort(int[] arr, int low, int high) {if (low < high) {// 三数取中法选择基准元素int mid = low + (high - low) / 2;if (arr[low] > arr[mid]) {swap(arr, low, mid);}if (arr[mid] > arr[high]) {swap(arr, mid, high);if (arr[low] > arr[mid]) {swap(arr, low, mid);}}// 分区操作,返回基准元素的最终位置int pivotIndex = partition(arr, low, high);// 递归排序基准元素左边的子数组quickSort(arr, low, pivotIndex - 1);// 递归排序基准元素右边的子数组quickSort(arr, pivotIndex + 1, high);}
}

总结:快速排序通过分区和递归的方式实现了高效的排序,是一种常用的排序算法。尽管它有一些缺点,但在大多数情况下,快速排序仍然是一种高效的排序算法。

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

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

相关文章

代码随想录学习Day 37

1049.最后一块石头的重量Ⅱ 题目链接 讲解链接 思路&#xff1a;与前一题基本一致&#xff0c;将所有石头分为重量最接近sum/2的两堆&#xff0c;碰撞之后剩下的就是最小值 动规五部曲&#xff1a; 1.dp数组及其下标含义&#xff1a;重量为j的背包所能容纳的最大价值&#…

使用C#快速搭建一个在windows运行的exe应用

文章目录 一、前言1.1 编写语言需要工具1.2 选择自己需要的组件进行安装 二、新建项目1.1 新建一个 .NET4.x 的项目1.2 添加一个小案例1.3 对界面进行美化1.3.1、配置Form属性1.3.2、配置Button按钮 1.4 查看组将的相关代码 三、后记 一、前言 这是一个比较旧的内容&#xff0…

【android】json

设置第potition个数据项的view的属性 成功显示数据项&#xff0c;熟悉recycleview三个方法 新建页面&#xff0c;定义适配器&#xff0c;指定使用MyViewHolder类对象保存每个数据胡view组件 padding-内部边距 bold-加粗 新建类&#xff0c;描述新闻内容 定义组件 public i…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点&#xff1a; ● 模拟信号采集&#xff0c;隔离转换 RS-485/232输出 ● 采用12位AD转换器&#xff0c;测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高&…

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR&#xff08;Address Resolution Protocol&#xff09;即地址解析协议&#xff0c;负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址&#xff0c;逻辑 IP 地址和物理 MAC 地址&…

如何保证数据库和缓存的一致性

背景&#xff1a;为了提高查询效率&#xff0c;一般会用redis作为缓存。客户端查询数据时&#xff0c;如果能直接命中缓存&#xff0c;就不用再去查数据库&#xff0c;从而减轻数据库的压力&#xff0c;而且redis是基于内存的数据库&#xff0c;读取速度比数据库要快很多。 更新…

android studio过滤日志

荣耀手机的日志有很多乱七八糟的输出 在logcat设置过滤 filter name:过滤名称随意 log tag不知道是什么 log message设置过滤的内容或者设置显示的内容 需要过滤的内容&#xff1a; ^(?!.*(gralloc4|InputMethodManager|tagSocket|dataspace)).*$以|分割要过滤的内容 要显…

力扣刷题记录: 1339. 分裂二叉树的最大乘积

本题是第174场周赛的 Q3&#xff0c;LC竞赛分为1675. 方法一. 递归&#xff08;超时&#xff09; 单纯使用递归对每一个节点进行遍历&#xff0c;代码如下&#xff1a; class Solution {long long ans -1; public:int maxProduct(TreeNode* root) {long long total_sum sum…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后&#xff0c;网络层负责添加IP段&#xff0c;包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

备战 清华大学 上机编程考试-冲刺前50%,倒数第3天

T1:水滴 - 模拟 这是一个经典的游戏。 在一个 &#x1d45b;&#x1d45a; 的棋盘上&#xff0c;每一个格子中都有一些水滴。 玩家的操作是&#xff0c;在一个格子中加一滴水。 当一个格子中的水滴数超过了 4&#xff0c;这一大滴水就会因格子承载不住而向外扩散。扩散的规…

如何将 API 管理从 Postman 转移到 Apifox

上一篇推文讲到用 Swagger 管理的 API 怎么迁移到 Apifox&#xff0c;有许多同学反馈说能不能介绍一下 Postman 的迁移以及迁移过程中需要注意的事项。那么今天&#xff0c;它来了&#xff01; 从 Postman 迁移到 Apifox 的方法有两种&#xff1a; 导出 Postman 集合 &#x…

详细介绍如何解决vcomp140.dll丢失的步骤,分享几种vcomp140.dll修复方法

当这个vcomp140.dll文件丢失时&#xff0c;可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到vcomp140.dll丢失的问题&#xff0c;但是这并不是不可解决的困难。接下来就和大家分享几种解决vcomp140.dll丢失的方法&#xff0c;给大家详细的关于如何解决vcomp140.dll…

MySQL-连接查询

049-内连接之等值连接 案例&#xff1a;查询每个员工所在的部门名称&#xff0c;要求显示员工名、部门名。 select e.ename, d.dname from emp e inner join dept d on e.deptnod.deptno;注意&#xff1a;inner可以省略 select e.ename, d.dname from emp e join dept d on…

你的医书是假的!批评《DDD诊所——聚合过大综合症》(合集)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 &#xff08;《你的医书是假的&#xff01;》原文写于2023年8月&#xff0c;以系列文章方式发表&#xff0c;现合并成一篇文章&#xff09; 一、说在前面 这两天在“ Thoughtworks洞见…

mask2former利用不确定性采样点选择提高模型性能

在机器学习和深度学习的训练过程中&#xff0c;不确定性高的点通常代表模型在这些点上的预测不够可靠或有较高的误差。因此&#xff0c;关注这些不确定性高的点&#xff0c;通过计算这些点的损失并进行梯度更新&#xff0c;可以有效地提高模型的整体性能。确定性高的点预测结果…

【python】tkinter GUI开发: 多行文本Text,单选框Radiobutton,复选框Checkbutton,画布canvas的应用实战详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Vue3使用datav3报错问题解决

报错&#xff1a;Failed to resolve entry for package "dataview/datav-vue3". The package may have incorrect main/module/exports specified in its package.json. 修改package.json 修改为 "module": "./es/index.mjs",

ElasticSearch基本用法

1.查询所有索引&#xff1a; GET _cat/indices 2.根据id查询索引里指定数据&#xff08;users为索引名&#xff0c;1为id的值&#xff09;&#xff1a; GET users/_doc/1 3.查询索引里所有的数据(product为索引名) GET product/_search 4.局部更新指定的数据&#xff08…

细说MCU串口函数及使用printf函数实现串口发送数据的方法

目录 1、硬件及工程 2、串口相关的库函数 &#xff08;1&#xff09;串口中断服务函数&#xff1a; &#xff08;2&#xff09;串口接收回调函数&#xff1a; &#xff08;3&#xff09;串口接收中断配置函数&#xff1a; &#xff08;4&#xff09;非中断发送&#xff…