排序-快速排序

快速排序(Quick Sort)是一种高效的排序算法,由英国计算机科学家霍尔(C. A. R. Hoare)在1960年提出。它的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。以下是快速排序的主要知识点:

  1. 基本思想

    • 选择一个基准元素(pivot)。
    • 通过一趟排序将待排序列分割成独立的两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大。
    • 然后对这两部分分别进行快速排序,整个排序过程可以递归进行。
  2. 选择基准元素

    • 基准元素的选择有多种方法,如选择序列的第一个、最后一个或中间元素作为基准。
    • 基准元素的选择对快速排序的性能有很大影响,因此有些优化版本的快速排序会采用更复杂的策略来选择基准元素。
  3. 分割过程

    • 从序列的右端开始,向左扫描,找到第一个小于基准元素的元素。
    • 从序列的左端开始,向右扫描,找到第一个大于基准元素的元素。
    • 交换这两个元素的位置。
    • 重复以上步骤,直到左、右指针相遇或交错。
  4. 递归排序

    • 对基准元素左边的子序列和右边的子序列分别进行快速排序。
  5. 优化策略

    • 三数取中法:选择序列首、尾、中间三个数中的中值作为基准元素,以减少最坏情况(O(n^2))的发生概率。
    • 小数组直接插入排序:当子序列的长度较小时,直接采用插入排序而不是递归调用快速排序,因为插入排序在处理小数组时效率更高。
    • 处理相等元素:在分割过程中,当遇到与基准元素相等的元素时,可以将其与基准元素交换到同一侧,以减少不必要的交换和比较。
  6. 时间复杂度

    • 平均时间复杂度:O(nlogn),其中n是待排序列的长度。
    • 最坏时间复杂度:O(n2),当输入序列已经有序或接近有序时,快速排序的性能会退化为O(n2)。
    • 最好时间复杂度:O(nlogn),当每次分割都能将序列均匀地分成两部分时,快速排序的性能最好。
  7. 空间复杂度

    • 快速排序是原地排序算法,空间复杂度为O(logn),其中logn是递归调用栈的最大深度。但在最坏情况下,递归调用栈的深度可能达到n,因此空间复杂度为O(n)。然而,这种情况在实际应用中很少出现。
  8. 稳定性

    • 快速排序是不稳定的排序算法,因为在分割过程中可能会改变相等元素的相对顺序。
  9. 代码示例:

public class QuickSort {  public static void quickSort(int[] array, int left, int right) {  if (left < right) {  int pivotIndex = partition(array, left, right);  quickSort(array, left, pivotIndex - 1);  quickSort(array, pivotIndex + 1, right);  }  }  private static int partition(int[] array, int left, int right) {  int pivot = array[right]; // 通常选择最右侧的元素作为基准  int i = left - 1; // i为小于基准元素的索引  for (int j = left; j <= right - 1; j++) {  if (array[j] <= pivot) {  i++;  // 交换array[i]和array[j]  int temp = array[i];  array[i] = array[j];  array[j] = temp;  }  }  // 将基准元素放到正确的位置  int temp = array[i + 1];  array[i + 1] = array[right];  array[right] = temp;  // 返回基准元素的索引  return i + 1;  }  public static void main(String[] args) {  int[] array = {3, 6, 8, 10, 1, 2, 1};  quickSort(array, 0, array.length - 1);  // 打印排序后的数组  for (int num : array) {  System.out.print(num + " ");  }  }  
}

在这个实现中,quickSort 方法是递归的主体部分,它调用 partition 方法来选择一个基准元素,并将数组分为两部分。partition 方法负责选择基准元素(这里选择的是最右侧的元素),并重新排列数组,使得小于基准的元素都在其左边,大于基准的元素都在其右边。然后,quickSort 方法递归地对基准元素左右两边的子数组进行排序。

在 main 方法中,我们创建了一个需要排序的数组,并调用了 quickSort 方法。最后,我们打印出排序后的数组。

注意,这个实现假设输入的数组 array 不会被其他线程修改,并且在排序过程中不会改变原数组(因为它是在原数组上进行原地排序的)。

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

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

相关文章

探究Spring Boot自动配置的底层原理

在当今的软件开发领域&#xff0c;Spring Boot已经成为了构建Java应用程序的首选框架之一。它以其简单易用的特性和强大的功能而闻名&#xff0c;其中最引人注目的特性之一就是自动配置&#xff08;Auto-Configuration&#xff09;。Spring Boot的自动配置能够极大地简化开发人…

VS2022 使用C++访问 mariadb 数据库

首先,下载 MariaDB Connector/C++ 库 MariaDB Products & Tools Downloads | MariaDB 第二步,安装后 第三步,写代码 #include <iostream> #include <cstring> #include <memory> #include <windows.h>#include <mariadb/conncpp.hpp>…

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…

js中有哪些函数?

命名函数&#xff1a;通过function声明的函数&#xff1b; 匿名函数&#xff1a;通过函数表达式定义的函数&#xff1b; 自执行函数&#xff1a;自动执行的函数&#xff0c;不可以被调用&#xff0c;也称为一次性函数&#xff1b; 闭包函数&#xff1a;内部可以访问外部&…

winform 应用程序 添加 wpf控件后影响窗体DPI改变

第一步&#xff1a;添加 应用程序清单文件 app.manifest 第二步&#xff1a;把这段配置 注释放开&#xff0c;第一个配置true 改成false

Java——只保留一位小数

使用return Math.random(); 要将 Math.random() 的结果保留一位小数&#xff0c;您可以使用以下代码&#xff1a; double randomNumber Math.random(); double roundedNumber Math.round(randomNumber * 10.0) / 10.0; return roundedNumber; 这里的关键是将随机数乘以 …

Wifi通信协议:WEP,WPA,WPA2,WPA3,WPS

前言 无线安全性是保护互联网安全的重要因素。连接到安全性低的无线网络可能会带来安全风险&#xff0c;包括数据泄露、账号被盗以及恶意软件的安装。因此&#xff0c;利用合适的Wi-Fi安全措施是非常重要的&#xff0c;了解WEP、WPA、WPA2和WPA3等各种无线加密标准的区别也是至…

实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

go 基础笔记

文章目录 go 基础笔记Go项目依赖关系ORM&#xff08;对象关系映射&#xff09;库mysql 建库 go 基础笔记 _ "github.com/go-sql-driver/mysql"该行代码是Go语言中的导入语句&#xff0c;但带有下划线&#xff08;_&#xff09;前缀表示该包被导入但其内容不会被直接…

【单片机毕业设计选题24008】-基于单片机的寝室系统设计

系统功能: 1. 采用STM32最小系统板控制&#xff0c;将采集到温湿度光照等传感器数据显示在OLED上 2. 通过离线语音模块开关灯&#xff0c;风扇&#xff0c;门。 3. 监测到MQ2烟雾后触发报警。 4. 语音&手动&定时控制窗帘。 5. 按键开启布防模式&#xff0c;布防后…

上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于mcu usb而言&#xff0c;大部分情况下&#xff0c;它和上位机之间的关系都是device的关系。一般usb&#xff0c;可以分成host和device。如果mc…

自动化测试git的使用

git是一款分布式的配置管理工具。本文主要讲git如何在自动化测试中安装&#xff0c;上传及拉取下载代码。 1 、git 介绍 每天早上到公司&#xff0c;从公司的git服务器上下载最新的代码&#xff0c;白天在最新的代码基础上&#xff0c;编写新的代码&#xff0c;下班时把“代码…

SSID简介

一、 SSID 概念定义 SSID&#xff08;Service Set Identifier&#xff09;即服务集标识符。它是无线网络中的一个重要标识&#xff0c;用于区分不同的无线网络。 相当于无线网络的名称&#xff0c;用于区分不同的无线网络。用户在众多可用网络中识别和选择特定网络的依据。通…

消息队列-消息队列保证消息可靠性的一些建议

如何检测到消息丢失&#xff1f; 美团消息队列文章中提到了对消息队列的监控手段&#xff0c;我理解消息丢失&#xff0c;根据不同节点来查看监控&#xff1a; 生产者生产丢失&#xff1a;监控中生产者生产量异常消费者消费丢失&#xff1a;查看消费者消息延迟监控、消费者 o…

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电&#xff0c;高压上电流程一般理解为高压件通电的过程&#xff0c;具体流程如下&#xff1a; 1、点火开关处于ON档时&#xff0c;仪表盘点亮&#xff0c;低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

基于Java自习室在线预约系统 的设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

解决JupyteNotebook打不开问题

问题&#xff1a;打开jupyternotebook出现黑色界面&#xff0c;马上闪退 步骤&#xff1a; 1、winr&#xff0c;cmd进入&#xff0c;conda activate yes 进入yes环境&#xff08;后面是要下载新的jupyter notebook&#xff09;,我这里下载到了yes环境下 2、下载jupyter Note…

<Rust><iced>基于rust使用iced库构建GUI实例:图片的格式转换程序

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本文是专栏第二篇实例&#xff0c;是一个图像格式转换程序&#xff0c;基于rust图像处理库image以及文件处理库rfd。 UI演示&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] URL拼接(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 URL拼接(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

Python中的数据可视化:绘制三维线框图plot_wireframe()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化&#xff1a; 绘制三维线框图 plot_wireframe() [太阳]选择题 在上面的代码中&#xff0c;plot_wireframe() 方法用于绘制什么类型的图形&#xff1f; import matplot…