数据结构奇妙旅程之深入解析快速排序

快速排序(Quick Sort)是一种高效的排序算法,它使用了分治法的策略来将一个数组排序。其基本思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比基准元素小,另一部分的所有数据都比基准元素大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

工作原理

  1. 选择基准:从待排序的序列中选一个元素作为基准(pivot)。

  2. 分割操作:将待排序的记录序列划分成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分继续进行排序,以达到整个序列有序。

  3. 递归排序:递归地将两个子序列达到有序。

优点

  • 平均时间复杂度为 O(n log n),在实际应用中经常比其它 O(n log n) 算法更快。
  • 原地排序算法,只需要很少的额外空间。

缺点

  • 不稳定排序算法,相同元素的位置可能发生改变。
  • 最坏情况下时间复杂度为 O(n^2),但在实际应用中通过随机化基准或使用三数取中等方法可以避免。

代码实现

以下是一个简单的 Java 实现:

public class QuickSort {public static void quickSort(int[] arr, int left, int right) {if (left < right) {int pivotIndex = partition(arr, left, right);quickSort(arr, left, pivotIndex - 1);quickSort(arr, pivotIndex + 1, right);}}private static int partition(int[] arr, int left, int right) {int pivot = arr[right]; // 选择最右边的元素作为基准int i = left - 1; // 指向小于基准的元素for (int j = left; j < right; j++) {if (arr[j] <= pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, right); // 将基准元素放到正确的位置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 = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.length - 1);for (int i : arr) {System.out.print(i + " ");}}
}

在上面的代码中,quickSort 方法是快速排序的入口点,它接收一个数组和排序的左右边界。partition 方法用于确定基准元素的最终位置,并返回其索引。swap 方法是一个简单的辅助方法,用于交换数组中的两个元素。

main 方法中,我们创建了一个待排序的数组,并调用 quickSort 方法进行排序。最后,我们遍历排序后的数组并打印出来。

优化

在实际应用中,为了优化性能,可以采用以下策略:

  • 三数取中法:选择序列头、尾和中间三个元素中的中值作为基准,减少出现最坏情况的可能性。
  • 随机化基准:随机选择一个元素作为基准,这样可以使得算法的平均性能更好。
  • 小数组使用插入排序:当待排序的序列长度较短时,使用插入排序可能更有效率。

快速排序是一种非常实用的排序算法,了解其工作原理和实现方式对于提升编程能力和算法理解都非常有帮助。

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

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

相关文章

15、Spring Cloud Alibaba Sentinel实现熔断与限流

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、Sentinel 1.1、官网 https://sentinelguard.io/zh-cn/ 等价对标 Spring Cloud Circuit Breaker 1.2、是什么 https://github.com/alibaba/Sentinel/wiki 1.3、去哪下 https://github.com/alibab…

如何在Ubuntu系统使用Docker搭建MongoDB结合内网穿透实现公网连接

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署Mon…

头歌实训--机器学习(决策树)

第1关&#xff1a;决策树简述 第2关&#xff1a;决策树算法详解 import numpy as np from sklearn import datasets#######Begin####### # 划分函数 def split(x,y,d,value):index_a(x[:,d]<value)index_b(x[:,d]>value)return x[index_a],x[index_b],y[index_a],y[inde…

[linux]--关于进程概念(上)

目录 冯诺依曼体系结构 操作系统 概念 设计os的目的 定位 如何理解管理 总结 系统调用和库函数概念 进程 描述进程-pcb 组织进程 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程-fork初识 进程状态 阻塞和挂起 Z(zombie)-僵尸进程 冯诺依曼体系结…

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中&#xff0c;如果你想通过命令行查询出一系列匹配某个关键词的进程&#xff0c;并使用xargs命令批量结束这些进程&#xff0c;可以按照以下步骤操作&#xff1a; # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者&#xff0c;如果…

疫情居家办公OA系统设计与实现| Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

常用的Node.js命令集锦

当使用Node.js开发时&#xff0c;以下是一些常用的Node.js命令集锦&#xff1a; npm init 用于初始化一个新的Node.js项目&#xff0c;并创建一个package.json文件来管理项目的依赖和元数据。 npm install [package-name] 用于安装指定的Node.js包&#xff0c;可以通过--save选…

学习要不畏难

我突然发现&#xff0c;畏难心是阻碍我成长的最大敌人。事未难&#xff0c;心先难&#xff0c;心比事都难&#xff0c;是我最大的毛病。然而一念由心生&#xff0c;心不难时&#xff0c;则真难事也不再难。很多那些自认为很难的事&#xff0c;硬着头皮做下来的时候&#xff0c;…

19.严丝合缝的文明——模板方法模式详解

“项目评审的节点又快到了&#xff0c;PPT你写了没&#xff1f;” “Oops&#xff0c;忘了&#xff0c;有模板没&#xff1f;给我一份” 概述 模板&#xff0c;一个频繁出现在办公室各类角色口中的词&#xff0c;它通常意味着统一、高效、经验和优质。各项汇报因为PPT的模板变…

操作系统目录

北航操作系统 chapter 1 北航操作系统 chapter3-1 内存管理 北航操作系统chapter3-2 内存管理 北航操作系统chapter3-3 页式管理 北航操作系统chapter3-4 段式管理 北航操作系统chapter3-5 虚拟内存管理 操作系统chapter4-1 进程与线程 北航操作系统-chapter4.2 同步与互斥…

002-基于Pytorch的Fashion-MNIST图像分类

本节将介绍一种 2.1 Fashion-MNIST 只要学习过深度学习相关理论的人&#xff0c;都一定听说过第一个真正有用的CNN模型LeNet-5&#xff0c;以及该模型所处理的数据库-MNIST。 FashionMNIST 是一个替代 MNIST 手写数字集的图像数据集。 它是由 Zalando&#xff08;一家德国的时…

C语言字符函数与字符串函数:编织文字的舞会之梦(下)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 七、strncpy的使用以及模拟实现 八、strncat的使用以及模拟实现 九、strncmp的使用以及模拟实现 十、strstr的使用以及模拟…

Python 使用 PyQt5 设计一个查询IP对话框程序

当前环境&#xff1a;Win10 x64 Python 3.8.10 PyQt5.15.2 PyQt-tools5.15.9.33 1 打开 designer.exe ,新建一个 Dialog without Buttons , 设计窗体。 C:\Python\Python38-32\Lib\site-packages\qt5_applications\Qt\bin\designer.exe 2 使用命令转换为 py C:\Python\Pyth…

什么是原型链

1、原型链的本质 是一个链表&#xff0c;当使用一个构造函数时&#xff0c;就会返回一个实例&#xff0c;在这个实例上找某个属性未找到时&#xff0c;则会顺着proto属性指向它的原型&#xff0c;去原型上找&#xff0c;如果原型也没有的话&#xff0c;则会顺着原型的原型找&a…

HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ17 坐标移动

HJ14 字符串排序 字符串排序_牛客题霸_牛客网 题目分析 使用C的标准库函数sort来简单解决。首先&#xff0c;我们读取给定数量的字符串&#xff0c;然后使用sort函数对它们进行字典序排序&#xff0c;最后输出排序后的字符串列表。 #include <iostream> #include <…

「Linux系列」Shell 输入/输出重定向

文章目录 一、Shell 输入重定向二、Shell 输出重定向标准输出重定向&#xff1a;标准错误输出重定向&#xff1a;同时重定向标准输出和错误输出&#xff1a;禁用输出&#xff1a; 三、Shell 重定向命令输出重定向&#xff1a;错误输出重定向&#xff1a;标准输出和错误输出同时…

在 Windows 中安装配置并启动运行 Jenkins【图文详细教程】

安装 Jenkins 的系统要求&#xff1a; 最少 256MB 可用内存最少 1GB 可用磁盘空间JDK 8 / 11 /17&#xff08;Jenkins 是用 Java 写的&#xff0c;打包成 war 包&#xff09; 查看 JDK 的版本 Java JDK 在 Windows 中安装可以参考&#xff1a;https://www.yuque.com/u27599042/…

AOI检测是如何逐步渗透进半导体领域

欢迎关注GZH《光场视觉》 一直以来AOI检测都是制造业视觉检测系统产业的核心要素。 AOI检测技术应运而生的背景是&#xff1a;电子元件集成度与精细化程度高&#xff0c;检测速度与效率更高、检测零缺陷的发展需求。 在制造业视觉检测系统中下游应用领域中&#xff0c;AOI检测…

vue相关的一些知识总结

一、前言 这里会记录一些Vue的学习和实践路上的一些琐碎知识的总结&#xff0c;很多东西不用深入去了解&#xff0c;或者简单记录即可&#xff0c;深入了解可以去搜别的开发者的总结。 目录 一、前言 二、Vue 相关知识 Vite 和 Vue CLI 单文件组件和多文件组件 prototype …

波奇学Linux:网络接口

127.0.0.1本地回环ip&#xff0c;用于本地测试&#xff0c;不会进行网络通信 TCP是面向连接的&#xff0c;服务器比较被动 需要服套接字监听 listen状态 正常通信默认会进行主机序列和网络序列的转换 TcpServer.cc #pragma once#include<iostream> #include<string…