Python算法设计 - 快速排序

news/2025/3/15 8:31:37/

目录

    • 一、快速排序
    • 二、Python算法实现

一、快速排序

快速排序的概念相信大家都能理解,下面这个算法是基于同样想法的另一种算法,其中利用到了分区。如果实施正确,这是一种非常有效的算法,在预期的O(n.log n) 时间内运行,乘法常数非常低,大约为2

需要注意的是,该算法的标准版本仅在唯一数据上是线性的。如果元素出现多次,性能会下降。它是一种3向快速排序,它将数据分成三个分区,较低、较高和类似于pivot区。另一个注意的地方就是枢轴的均匀随机化,这是证明算法预期在线性时间运行的重要部分

二、Python算法实现

我们首先来测试在排序时不使用这个排序算法的时间是多少呢?

import numpy as npdef swap(data, i, j):data[i], data[j] = data[j], data[i]
def qsort3(data, left, right):if left >= right:return# 选择中心点i = np.random.randint(left, right + 1)swap(data, left, i)pivot = data[left]# i表示左分区元素后的序号# j表示右分区元素后的序号# k表示当前元素的序号i, j, k = left, right, left + 1# 分割元素[left] + [pivot] + [right]while k <= j:if data[k] < pivot:swap(data, i, k)i += 1elif data[k] > pivot:swap(data, j, k)j -= 1k -= 1k += 1# 递归qsort3(data, left, i - 1)qsort3(data, j + 1, right)
def qsort(data):qsort3(data, 0, len(data) - 1)data = np.random.randint(0, 10, 100)
print(data)

看一下测试结果和运行时间
在这里插入图片描述
可以看到,此时数据是随机的,完成时间是1.7s

接下来我们把print(data)注释掉,先用算法排序之后再print

import numpy as npdef swap(data, i, j):data[i], data[j] = data[j], data[i]
def qsort3(data, left, right):if left >= right:returni = np.random.randint(left, right + 1)swap(data, left, i)pivot = data[left]i, j, k = left, right, left + 1while k <= j:if data[k] < pivot:swap(data, i, k)i += 1elif data[k] > pivot:swap(data, j, k)j -= 1k -= 1k += 1qsort3(data, left, i - 1)qsort3(data, j + 1, right)
def qsort(data):qsort3(data, 0, len(data) - 1)data = np.random.randint(0, 10, 100)
# print(data)qsort(data)
print(data)

测试结果
在这里插入图片描述

可以看到,在经过算法排序之后,再print(data),不仅正确排序,时间花费仅为0.5s,运行时间效率提高了


http://www.ppmy.cn/news/61656.html

相关文章

关于FPGA基础知识 LCMXO2-7000HC-4TG144C MachXO2系列 FPGA可编程逻辑简介

关于FPGA基础知识 LCMXO2-7000HC-4TG144C lattice莱迪斯深力科 MachXO2系列 FPGA可编程逻辑简介 FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一…

golang实现守护进程(3)—

前言 在操作系统中&#xff0c;每个进程都有自己的进程ID(PID)&#xff0c;父进程ID(PPID)等信息。如果一个进程已经退出&#xff0c;但它的、它的资源和状态还留在系统中&#xff0c;这种进程被称为“僵尸进程”。僵尸进程不占用CPU时间和内存资源&#xff0c;但它们占用系统…

科研人的利器:利用New Bing五分钟读完一篇论文

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我&#xff0c;拉你进群。 New Bing『新必应』是微软一款集成了ChatGPT的搜索引擎&#xff0c;它以聊天的方式来进行信息搜索&#xff0c;这不同过去几十年通过对话框搜索信…

谈谈接口 0.0

目录 接口的概念 接口语法 接口的成员变量与方法 接口的使用 实现多个接口 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等... 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘…

阿里云服务器配置选择流程(2023新版教程)

阿里云服务器ECS选购指南&#xff0c;阿里云百科分享2023阿里云服务器新手选择流程&#xff0c;选购云服务器有两个入口&#xff0c;一个是选择活动机&#xff0c;只需要选择云服务器地域、系统、带宽即可&#xff1b;另一个是在云服务器页面&#xff0c;自定义选择云服务器配置…

查询文件路径

1 问题 如何利用Java来查询文件的路径&#xff1f; 2 方法 1首先在类中利用main函数调用所有文件的和目录的代码。 2 然后开始写查询展示所有文件和目录的方法&#xff08;运用了递归的思想&#xff09; import java.io.File;import java.util.Arrays;import java.util.Scanner…

行业趣闻 | 在施工现场“打灰”,挺好的?

房地产市场的不景气对土木行业的冲击、某某大学土木工程专业招不到人、某央企施工人员因吐槽土木行业现状而被辞退…… 面对互联网上诸多对土木行业的调侃和流言&#xff0c;许多土木工程专业的同学变得迷茫了。 这个行业的实际情况究竟是怎样的&#xff1f; 图源网络 2018年10…

Java开发 - SpringCache初体验

前言 早些时候,博主介绍过Redis的使用:Java开发 - Redis初体验,Redie是基于缓存的一项技术,对于Redis,博主此处不再赘述,不了解的可以去看这篇文章,但Redis缓存并不是顶峰,本文要讲的内容就是Redis的辅助工具:SpringCache——的使用。有了SpringCache,Redis便可如虎…