快排序解读

排序算法是计算机科学中不可或缺的一部分,它们在各种数据处理场景中发挥着关键作用。在众多排序算法中,快速排序以其高效的性能和简洁的实现成为了许多程序员的首选。今天,我们就来深入剖析快速排序算法,了解其原理、实现方式以及应用。

一、快速排序的原理

快速排序的基本思想是采用分治法(Divide and Conquer)来将一个数组排序。它选择一个元素作为“基准”(pivot),通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比基准小,另一部分的所有数据都比基准大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述

二、快速排序的实现

快速排序的实现主要包括三个步骤:选择基准、划分数组和递归排序。

  1. 选择基准:通常可以选择数组的第一个元素、最后一个元素或者随机选择一个元素作为基准。
  2. 划分数组:将数组划分为两部分,使得一部分的元素都小于基准,另一部分的元素都大于基准。这通常通过遍历数组并交换元素来实现。
  3. 递归排序:对划分后的两部分数组递归地应用快速排序算法。

下面是一个使用Python实现的快速排序示例:

def quicksort(arr):  if len(arr) <= 1:  return arr  pivot = arr[len(arr) // 2]  left = [x for x in arr if x < pivot]  middle = [x for x in arr if x == pivot]  right = [x for x in arr if x > pivot]  return quicksort(left) + middle + quicksort(right)  # 示例  
arr = [3,6,8,10,1,2,1]  
print(quicksort(arr))  # 输出: [1, 1, 2, 3, 6, 8, 10]

在这个实现中,我们选择了数组的中间元素作为基准,并使用列表推导式来创建小于、等于和大于基准的元素的子列表。然后,我们递归地对左右两个子列表进行快速排序,并将结果合并起来。

三、快速排序的性能与优化

快速排序的平均时间复杂度为O(n log n),但在最坏情况下,当输入数组已经有序或逆序时,时间复杂度会退化为O(n^2)。为了避免最坏情况的发生,可以采取一些优化措施,如随机选择基准、使用三数取中等方法来选择更好的基准。

此外,快速排序的空间复杂度为O(log n)(递归调用栈),但在原地排序的版本中,空间复杂度可以优化到O(1)。

1. 随机选择基准
随机选择基准可以减少输入数据已经部分有序时对算法性能的影响。Python中的random.choice函数可以用来从列表中随机选择一个元素作为基准。

import random  def partition(arr, low, high):  # 随机选择一个基准  pivot_index = random.randint(low, high)  arr[pivot_index], arr[high] = arr[high], arr[pivot_index]  # 将基准元素放到末尾  pivot = arr[high]  i = low - 1  # 指向小于基准的元素的指针  for j in range(low, high):  if arr[j] <= pivot:  i += 1  arr[i], arr[j] = arr[j], arr[i]  arr[i + 1], arr[high] = arr[high], arr[i + 1]  # 将基准元素放到正确的位置  return i + 1  def quicksort(arr, low, high):  if low < high:  pi = partition(arr, low, high)  quicksort(arr, low, pi - 1)  quicksort(arr, pi + 1, high)  # 示例  
arr = [3, 6, 8, 10, 1, 2, 1]  
n = len(arr)  
quicksort(arr, 0, n - 1)  
print("Sorted array is:", arr)

2. 使用三数取中法选择基准
三数取中法是从待排序序列的首、尾和中间三个元素中选择一个中值作为基准。这种方法可以尽量避免输入数据已排序或逆序时造成的性能下降。

def median_of_three(arr, low, mid, high):  if arr[low] > arr[mid]:  arr[low], arr[mid] = arr[mid], arr[low]  if arr[mid] > arr[high]:  arr[mid], arr[high] = arr[high], arr[mid]  if arr[low] > arr[mid]:  arr[low], arr[mid] = arr[mid], arr[low]  return arr[mid]  def partition(arr, low, high):  mid = (low + high) // 2  pivot = median_of_three(arr, low, mid, high)  arr[mid], arr[high] = arr[high], arr[mid]  # 将基准元素放到末尾  i = low - 1  # 指向小于基准的元素的指针  for j in range(low, high):  if arr[j] <= pivot:  i += 1  arr[i], arr[j] = arr[j], arr[i]  arr[i + 1], arr[high] = arr[high], arr[i + 1]  # 将基准元素放到正确的位置  return i + 1  def quicksort(arr, low, high):  if low < high:  pi = partition(arr, low, high)  quicksort(arr, low, pi - 1)  quicksort(arr, pi + 1, high)  # 示例  
arr = [3, 6, 8, 10, 1, 2, 1]  
n = len(arr)  
quicksort(arr, 0, n - 1)  
print("Sorted array is:", arr)

在上面的代码中,median_of_three函数用来计算三个元素的中值,并将这个中值作为基准。这个基准随后被放到数组的末尾,然后执行标准的快速排序分区操作。注意,这里的分区操作partition函数也做了相应的调整,以配合新的基准选择方法。

四、快速排序的应用

快速排序因其高效的性能而在许多场景中得到了广泛应用。无论是在数据库管理系统中对大量数据进行排序,还是在算法竞赛中解决排序相关问题,快速排序都是一个不错的选择。同时,它也可以作为其他高级算法(如归并排序、堆排序等)的基础组件。

五、总结

快速排序是一种高效且实用的排序算法,通过分治法的思想将问题分解为更小的子问题来解决。在实现快速排序时,需要注意选择合适的基准和避免最坏情况的发生。通过不断优化和改进,我们可以使快速排序在更多场景下发挥出其强大的性能优势。

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

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

相关文章

比特币革命:刚刚开始

作者&#xff1a;Marius Farashi Tasooji 编译&#xff1a;秦晋 要充分理解比特币及其含义&#xff0c;首先必须理解什么是价值&#xff0c;什么是货币。以及是什么赋予资产价值&#xff1f; 这个问题看似愚蠢&#xff0c;但实际上非常有趣。我们的生活是由我们消费或出售的物品…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb &#xff0c;双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错&#xff0c;执行其他命令也报错。 安装环境&#xff1a;ubuntu18.04 dpkg: 处理软件包 code-insiders (…

Taro框架中的H5 模板基本搭建

1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板

在Spring中使用Redis

端口怎么设置&#xff0c;看我前一篇文章 前面使用jedis&#xff0c;通过Jedis对象中各种方法来操作redis的。 此处Spring中则是通过StringRedisTemplate来操作redis。 最原始提供的类是RedisTemplate StringRedisTemplate是RedisTemplate的子类&#xff0c;专门处理文本数据的…

PUBG绝地求生29.1版本延迟高/卡顿/掉帧/丢包的快速解决方法

要想在绝地求生中获得好成绩&#xff0c;咱们需求把握一些根本的游戏技巧。比方&#xff0c;在挑选降落点时&#xff0c;咱们可以运用u标签来着重“安全”二字。挑选一个相对较为安全的降落点可以防止与其他玩家过早触摸&#xff0c;给自己争夺更多时间来搜集资源和配备。接下来…

Vant DropdownMenu 下拉菜单带搜索功能

Vant DropdownMenu 下拉菜单带搜索功能 效果图&#xff1a; 上代码&#xff1a; <van-dropdown-menu active-color"#E33737"><van-dropdown-item ref"dropdownItem"><template #title><span>{{ dropdownItem.text }}</span…

Mysql密码修改问题

docker安装mysql&#xff0c;直接拉取镜像&#xff0c;挂载关键目录即可启动&#xff0c;默认3306端口。此时无法直接连接&#xff0c;需要配置密码。docker进入mysql容器中 docker exec -it mysql bash #mysq是容器名称&#xff0c;也可以用容器id通过修改mysql的配置进行免密…

应用商店备案登记流程解析

引言&#xff1a; 随着智能手机的普及和移动互联网的发展&#xff0c;移动应用程序&#xff08;App&#xff09;已成为人们日常生活中不可或缺的一部分。在开发一个App之后&#xff0c;开发者需要将其上传到应用商店进行审核和上架。然而&#xff0c;在上架之前&#xff0c;开…

智慧运维解决方案

1&#xff1a;排口截污 控源截污、内源治理、生态修复 通过传感器对周围环境进行监测&#xff0c;将雨水和污水分别流入不同的管道&#xff0c;进行分流和净化处理&#xff0c;守好排污口&#xff0c;解决城市雨水和污水污染问题&#xff0c;减少城市环境污染。 2&#xff1…

html骨架以及常见标签

推荐一个网站mdn。 html语法 双标签&#xff1a;<标签 属性"属性值">内容</标签> 属性&#xff1a;给标签提供附加信息。大多数属性以键值对的形式存在。如果属性名和属性值一样&#xff0c;可以致谢属性值。 单标签&#xff1a;<标签 属性"属…

私域电商客户要挨一刀的“订单发货管理”,微信:必须强制接入

文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;超90%的私域运营商家都见到了或者说遇到了这个问题&#xff0c;如果没有读懂这个微信的模型机制&#xff0c;一定会懵逼&#xff0c;微三云营销总监胡佳…

计算机网络:数据链路层 - 点对点协议PPP

计算机网络&#xff1a;数据链路层 - 点对点协议PPP PPP协议的帧格式透明传输字节填充法零比特填充法 差错检测循环冗余校验 对于点对点链路&#xff0c;PPP协议是目前使用最广泛的数据链路层协议。比如说&#xff0c;当用户想要接入互联网&#xff0c;就需要通过因特网服务提供…

被狠狠拷打!想冲 PDD 机器学习算法岗,一面直接挂了。。。

节前&#xff0c;我们社群组织了一场技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学&#xff0c;针对新手如何机器学习算法、企业级落地场景、大模型的发展趋势与落地实践、新人该如何备考、面试常考点等热门话题进行了深入的讨论。 …

LoRa自组网络设计 6

1 深入了解LoRaWan 1.1 LoRaWan概述 LoRaWAN采用星型无线拓扑 End Nodes 节点 Gateway 网关 Network Server 网络服务器 Application Server 应用服务器 LoRa联盟是2015年3月Semtech牵头成立的一个开放的、非盈利的组织&#xff0c;发起成员还有法国Actility&#xff0c;中国…

FL Studio21水果软件有哪些新功能?如何下载破解版

FL Studio 21是一款由Image-Line公司开发的专业的音乐制作软件&#xff0c;它提供了音乐编曲、录音、编辑、混音等多种功能&#xff0c;非常适合专业音乐制作人、DJ及音乐爱好者使用。这款软件不仅具有高级的音频编辑功能&#xff0c;如切片、时间伸缩、音高调整&#xff0c;还…

场景文本检测识别学习 day02(AlexNet论文阅读、ResNet论文精读)

怎么读论文 在第一遍阅读的时候&#xff0c;只需要看题目&#xff0c;摘要和结论&#xff0c;先看题目是不是跟我的方向有关&#xff0c;看摘要是不是用到了我感兴趣的方法&#xff0c;看结论他是怎么解决摘要中提出的问题&#xff0c;或者怎么实现摘要中的方法&#xff0c;然…

机器学习(五) -- 监督学习(2) -- k近邻

系列文章目录及链接 目录 前言 一、K近邻通俗理解及定义 二、原理理解及公式 1、距离度量 四、接口实现 1、鸢尾花数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、knn模型训练 3.5、模型评估 3.6、结果预测 4、超参数搜索-网格搜…

QT drawPixmap和drawImage处理图片模糊问题

drawPixmap和drawImage显示图片时&#xff0c;如果图片存在缩放时&#xff0c;会出现模糊现象&#xff0c;例如将一个100x100 的图片显示到30x30的区域&#xff0c;这个时候就会出现模糊。如下&#xff1a; 实际图片&#xff1a; 这个问题就是大图显示成小图造成的像素失真。 当…

【stm32】I2C通信协议

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

利用IP地址判断羊毛用户:IP数据云提供IP风险画像

在当今数字化社会&#xff0c;互联网已经成为人们日常生活和商业活动中不可或缺的一部分。然而&#xff0c;随着网络的普及&#xff0c;网络欺诈行为也日益猖獗&#xff0c;其中包括了羊毛党这一群体。羊毛党指的是利用各种手段获取利益、奖励或者优惠而频繁刷取优惠券、注册账…