数据结构-快速排序Java实现

目录

  • 一、引言
  • 二、算法步骤
  • 三、原理演示
    • 第一步:选择基准元素
    • 第二步:分区(Partition)
    • 第三步:递归
    • 第四步:合并
  • 四、代码实战
  • 五、结论

一、引言

    快速排序的核心思想是选择一个基准元素,将数组分为两个子数组:一个包含所有小于基准的元素,一个包含所有大于基准的元素。然后,递归地对这两个子数组进行排序,最终合并以得到已排序的数组。这个算法的关键在于快速地将数组分成两部分,从而减少排序问题的规模。

二、算法步骤

快速排序的基本步骤如下:

  1. 选择基准元素:从数组中选择一个基准元素。通常,可以选择数组的第一个元素、最后一个元素或中间元素作为基准。
  2. 分区:将数组中的元素重新排列,将小于基准的元素移到基准的左边,将大于基准的元素移到基准的右边,基准元素位于中间。
  3. 递归:对基准左边和右边的子数组分别应用快速排序。
  4. 合并:已排序的子数组与基准元素合并为最终排序的数组。

三、原理演示

假设我们有以下整数数组:
[64, 34, 25, 12, 22, 11, 90]

第一步:选择基准元素

    在快速排序的第一步,我们需要选择一个基准元素。通常情况下,可以选择数组中的第一个元素。在这个例子中,我们选择基准元素为 64。

第二步:分区(Partition)

    在分区步骤中,我们将数组中的元素重新排列,将小于基准的元素移到基准的左边,将大于基准的元素移到基准的右边,基准元素本身位于中间。这一步的目标是将基准元素放在它在排序后应该处于的位置。
    我们从数组的左边和右边分别开始,分别找到一个比基准元素大的元素和一个比基准元素小的元素。
    交换这两个元素,将较小的元素放在左边,较大的元素放在右边。继续这个过程,直到左右指针相遇。
在这个例子中,经过分区步骤,数组变为:
[34, 25, 12, 22, 11, 64, 90]
此时,基准元素 64 处于正确的位置。

第三步:递归

    在递归步骤中,我们将分区得到的两个子数组分别应用快速排序。对于左边的子数组 [34, 25, 12, 22, 11] 和右边的子数组 [90],我们分别进行快速排序。
重复这个过程,递归地将数组分解成更小的子问题。

第四步:合并

    在合并步骤中,已排序的子数组与基准元素合并为最终排序的数组。在这个例子中,左边的子数组 [11, 12, 22, 25, 34] 与右边的子数组 [90] 合并成了整个已排序的数组。
最终,整个数组变为:
[11, 12, 22, 25, 34, 64, 90]

这就完成了快速排序的过程。

四、代码实战

下面是使用Java编写的快速排序算法示例:

public class QuickSort {public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90};System.out.println("原始数组:");printArray(arr);quickSort(arr, 0, arr.length - 1);System.out.println("排序后的数组:");printArray(arr);}public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}}public 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++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;}public static void printArray(int[] arr) {for (int value : arr) {System.out.print(value + " ");}System.out.println();}
}

上述代码演示了快速排序的实现。它首先定义了一个包含整数数组的示例,然后调用 quickSort 方法来对数组进行排序。quickSort 方法使用递归来排序数组,而 partition 方法用于将数组分成两个子数组并返回基准元素的索引。

五、结论

我们一起来总结一下:

  1. 快速排序的时间复杂度在平均情况下为O(nlogn),而在最坏情况下为O(n2)。这主要取决于递归树的深度和每个递归调用中比较关键字的次数。在最坏情况下,即待排序的序列是正序或逆序,需要n-1次递归调用,且每次划分需要经过n-i次关键字比较,因此比较次数为(n-1)+…+3+2+1=n(n-1)/2,其时间复杂度为O(n2)。在平均情况下,通过优化选取枢轴的方法(如三数取中法),可以减少递归次数和关键字的比较次数,从而使时间复杂度降为O(nlogn)。
  2. 快速排序的空间复杂度为O(logn),这是由于递归调用的需要。在最坏情况下,递归树的深度为n,因此需要O(n)的空间来存储递归过程中的临时变量。但在平均情况下,由于递归次数减少,需要的空间复杂度为O(logn)。
  3. 快速排序算法的稳定性是指相同元素的相对位置在排序后不会改变。然而,由于关键字的比较和交换是跳跃进行的,因此快速排序算法是一种不稳定的排序方法。
  4. 快速排序算法有许多优化方法,如选取枢轴的优化、处理重复元素的优化等。其中选取枢轴的优化是采用三数取中法:取左端、中间、右端三个数进行排序,取中间的那个数作为枢轴,这样中间的数位于中间值的可能性就大大提高了。

点赞收藏,富婆包养✋✋

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

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

相关文章

垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程

文章目录 &#x1f34a; 垃圾回收器、垃圾回收算法、空间分配担保&#x1f389; Serial&#x1f389; ParNew&#x1f389; Parallel scavenge&#x1f389; 复制算法&#x1f389; 分代收集算法&#x1f389; 进入老年代的几种情况&#x1f4dd; 空间分配担保 &#x1f389; S…

超火的双臂烹饪机器人Project YORI,分分钟成为你的专属大厨!

原创 | 文 BFT机器人 当前行业内有两种通用的烹饪自动化方法&#xff1a;一种是“制造一个可以在普通厨房中运作的烹饪机器人&#xff0c;因为每个人都有厨房”&#xff0c;这听起来很不错&#xff0c;但接下来你就必须使你的烹饪机器人能够在厨房环境中正常运行&#xff0c;这…

docker 复习

文章目录 1. docker 基础1.1 docker 安装配置镜像加速器拉取镜像的仓库&#xff1a; docker 部署Mysql 镜像docker 命令的详细解释docker 常见命令docker 数据卷docker 相关命令总结 2.自定义镜像2.1 dockerfile2.2 try 构建一个Java镜像&#xff0c;并部署2.3 总结: 3. docker…

物流监管:智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&#xff0c…

2023年各省市区CMMI奖励补贴政策,最高150万元!!!

2023年CMMI资质认证补贴政策已落实&#xff0c;全国各省市政府相继给了很多补贴政策支持企业办理CMMI认证&#xff0c;有不少地区都是可以领取CMMI资质补贴的&#xff0c;来看看你企业所在地有没有补贴吧&#xff01; 北京 北京市 对服务外包企业取得的国际资质认证、或因数字…

Databend 开源周报第 115 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 聚合索引 Data…

[计算机提升] 系统及用户操作

1.4 系统及用户操作 1.4.1 系统操作 1.4.1.1 开机、关机、重启 在Windows系统中&#xff0c;开机&#xff08;Power On&#xff09;&#xff0c;关机&#xff08;Shutdown&#xff09;和重启&#xff08;Restart&#xff09;是指计算机的不同电源控制操作。 开机&#xff1a;…

苹果平板可以用别的电容笔吗?电容笔和Apple pencil区别

和苹果原装的Pencil相比&#xff0c;这种平替的电容笔并没具备重力压感&#xff0c;只有一种倾斜的压感功能。如果你不经常用来作画&#xff0c;一支普通的电容笔就足够了。不管是用来记笔记&#xff0c;还是用来解决一些数学问题&#xff0c;都能用得上。再说了&#xff0c;即…

NAND存储器转储分析 - 使用ECC修复位错误与UBI镜像固件分析

一、 简介 这篇研究论文将通过黑客的视角&#xff0c;详细阐述如何操作 NAND dump 以及如何获取 dump 文件中的所有文件。每一步骤以及所使用的方法均会细致解析&#xff0c;并配以实例说明。本文主要关注的是物理 NAND dump&#xff0c;这是从通用编程器中提取出的 dump 文件…

项目平台——测试报告的实现(七)

这里写目录标题 一、Table表格组件的使用1、Table表格组件中的插槽使用 二、点击查看测试报告&#xff0c;跳转到测试报告详情页实现1、新建Report.vue组件2、配置路由3、查看报告按钮添加事件 三、页面布局1、Layout布局2、卡片设计3、打开页面发送请求加载报告数据4、对接口进…

Java版本+企业电子招投标系统源代码+支持二开+招投标系统+中小型企业采购供应商招投标平台

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

大数据flink篇之三-flink运行环境安装后续一yarn-session安装

前提&#xff1a; Hadoop 必須保证在 2.2 以上&#xff0c;且必須裝有 hdfs 服务。Hadoop安装后续会有相关说明。 具体的&#xff0c;在生产环境中&#xff0c;flink一般会交由yarn、k8s等资源管理平台来处理。本章主要讲解yarn模式下的session cluster模式。 flink Session-C…

Java模拟双向链表,增删操作

public static void main(String[] args) {ArrayList arrayList new ArrayList();Node zhangsan new Node("张三");Node lisi new Node("李四");Node wanger new Node("王二");//模拟双向链表&#xff0c;将表中元素依次连接起来zhangsan.ne…

聊聊HttpClient的RedirectStrategy

序 本文主要研究一下HttpClient的RedirectStrategy RedirectStrategy org/apache/http/client/RedirectStrategy.java public interface RedirectStrategy {/*** Determines if a request should be redirected to a new location* given the response from the target ser…

Windows运维相关经验技巧

常用工具 在线PS Photoshop在线 FAQ 电脑能上网&#xff0c;浏览器上不了网 # 错误原因&#xff1a; 设置了网络代理&#xff0c;浏览器无法通过网络代理上网# 解决办法 关闭网络代理 &#xff08;1&#xff09;wini&#xff0c;打开设置 &#xff08;2&#xff09;网络和I…

【前端学习】—函数防抖(十)

【前端学习】—函数防抖&#xff08;十&#xff09; 一、什么是函数防抖 函数防抖&#xff1a;事件被触发n秒后再执行回调&#xff0c;如果在这n秒内又被触发&#xff0c;则重新计时。 二、代码实现 <script>const searchElement document.getElementById("searc…

多语言跨境商城源码搭建(定制代码+源码开源)

在全球化的背景下&#xff0c;跨境电商发展迅猛&#xff0c;多语言商城成为企业拓展海外市场的首要选择。本文将为大家介绍跨境多语言商城的源码搭建方法&#xff0c;以及相关的定制代码和源码开源信息。 一、什么是跨境多语言商城 跨境多语言商城是一种能够支持多国语言的电子…

黑马程序员Java Web--14.综合案例--修改功能实现

一、BrandMapper包 首先&#xff0c;在BrandMapper包中定义用来修改的方法&#xff0c;和使用注解的sql语句。 BrandMapper包所在路径&#xff1a; package com.itheima.mapper; /**** 修改* **/Update("update tb_brand set brand_name #{brandName},company_name #{c…

XTU-OJ 1339-Interprime

题目描述 n是两个连续的奇素数的平均值&#xff0c;且n不是素数&#xff0c;那么我们称这样的数是"内部素数"。求区间[a,b]内"内部素数"的个数。比如&#xff0c;前5个"内部素数"是4,6,9,12,15。 输入 第一行是样例数T(1≤T≤1000)。 每个样例一…

站外引流之道:跨境电商如何吸引更多流量?

随着跨境电商行业的蓬勃发展&#xff0c;站外引流成为卖家们必须掌握的关键技能。站外引流不仅有助于扩大产品曝光度&#xff0c;还能吸引更多潜在客户&#xff0c;提高销售额。 然而&#xff0c;站外引流并非易事&#xff0c;需要精心策划和执行。本文将探讨站外引流的策略&a…