Python 中的就地快速排序

2024-04-07

我必须用我选择的语言来实现作业的快速排序算法,所以我选择了 Python。

在讲座中,我们被告知 QuickSort 内存效率高,因为它就地工作;即,它没有用于递归的输入数组部分的额外副本。

考虑到这一点,我尝试在 Python 中实现 QuickSort 算法,但不久之后意识到,为了编写一段优雅的代码,我必须在递归时将数组的一部分传递给函数本身。由于每次执行此操作时 Python 都会创建新列表,因此我尝试使用 Python3(因为它支持 nonlocal 关键字)。以下是我的注释代码。

def quicksort2(array):
# Create a local copy of array.
arr = array

    def sort(start, end):
        # Base case condition
        if not start < end:
            return

        # Make it known to the inner function that we will work on arr
        # from the outer definition
        nonlocal arr

        i = start + 1
        j = start + 1

        # Choosing the pivot as the first element of the working part
        # part of arr
        pivot = arr[start]

        # Start partitioning
        while j <= end:
            if arr[j] < pivot:
                temp = arr[i]
                arr[i] = arr[j]
                arr[j] = temp
                i += 1
            j += 1
        temp = arr[start]
        arr[start] = arr[i - 1]
        arr[i - 1] = temp
        # End partitioning

        # Finally recurse on both partitions
        sort(start + 0, i - 2)
        sort(i, end)
    sort(0, len(array) - 1)

现在,我不确定我是否完成了这项工作,或者我是否遗漏了一些东西。我编写了一个更Pythonic 的QuickSort 版本,但这肯定不能就地工作,因为它不断返回输入数组的一部分并将它们连接起来。

我的问题是,这是Python 中的做法吗?我已经搜索了 Google 和 SO,但还没有找到 QuickSort 的真正就地实现,所以我认为最好询问一下。


当然不是最好的方法,加上这个著名的算法将有几十个完美的实现..这是我的,很容易理解

def sub_partition(array, start, end, idx_pivot):

    'returns the position where the pivot winds up'

    if not (start <= idx_pivot <= end):
        raise ValueError('idx pivot must be between start and end')

    array[start], array[idx_pivot] = array[idx_pivot], array[start]
    pivot = array[start]
    i = start + 1
    j = start + 1

    while j <= end:
        if array[j] <= pivot:
            array[j], array[i] = array[i], array[j]
            i += 1
        j += 1

    array[start], array[i - 1] = array[i - 1], array[start]
    return i - 1

def quicksort(array, start=0, end=None):

    if end is None:
        end = len(array) - 1

    if end - start < 1:
        return

    idx_pivot = random.randint(start, end)
    i = sub_partition(array, start, end, idx_pivot)
    #print array, i, idx_pivot
    quicksort(array, start, i - 1)
    quicksort(array, i + 1, end)

好的,首先是分区子例程的单独函数。它需要数组, 兴趣点的起点和终点,以及枢轴索引。这个功能应该很清楚

然后快速排序对整个数组第一次调用分区子例程;然后 递归地调用自身来对枢轴之前的所有内容以及之后的所有内容进行排序。

如果你不明白什么就问

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的就地快速排序 的相关文章

  • 如何在python 3.7中生成条形码

    我正在使用 python 3 7 为了生成条形码 我尝试使用安装 pyBarcode 库pip install pyBarcode 但它显示以下错误 找不到满足 pyBarcode 要求的版本 来自版本 找不到 pyBarcode 的匹配分
  • Sublime Text 插件开发中的全局 Python 包

    一 总结 我不知道 Sublime Text 插件开发人员如何使用 Sublime Text 查找全局 Python 包 而不是 Sublime Text 目录的 Python 包 Sublime Text使用自己的Python环境 而不是
  • 使用 pygame 显示 unicode 符号

    我检查了其他答案 但不明白为什么我的代码错误地显示 This is what I currently see https i stack imgur com 8tNIK png 这是关于文本渲染的相关代码 font pygame font
  • 删除 Django 1.7 中的应用程序(和关联的数据库表)

    是否可以使用 Django 1 7 迁移来完全删除 卸载应用程序及其所有跟踪 主要是其所有数据库表 如果没有 在 Django 1 7 中执行此操作的适当方法是什么 python manage py migrate
  • pyspark 数据框中的自定义排序

    是否有推荐的方法在 pyspark 中实现分类数据的自定义排序 我理想地寻找 pandas 分类数据类型提供的功能 因此 给定一个数据集Speed列 可能的选项是 Super Fast Fast Medium Slow 我想实现适合上下文的
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • Django send_mail SMTPSenderRefused 530 与 gmail

    一段时间以来 我一直在尝试使用 Django 从我正在开发的网站接收电子邮件 现在 我还没有部署它 并且我正在使用Django开发服务器 我不知道这是否会影响它 这是我的 settings py 配置 EMAIL BACKEND djang
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 在矩阵/位图中查找质量簇

    这是此处发布的问题的延续 在 2D 位图上查找质心 https stackoverflow com questions 408358 finding the center of mass on a 2d bitmap正如给出的例子 它讨论了
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud

随机推荐

  • 如何处理 Web 版 Twitter 数字 API

    我正在研究 Twitter 数字 api 将其集成到我的网站 该网站需要验证用户的唯一性 这里有一个link https dev twitter com twitter kit web digits 这是唯一一篇正式说明如何在网络上实现数字
  • 使用 Delphi 2010 进行远程调试时没有断点 - 所以卡在 Delphi 7 上

    去年 8 月进行初步调查后 我又重新开始使用 Delphi 2010 进行远程调试 我已确保 D2010 具有更新 4 和 5 并且远程调试器是 Embarcadero 网站上的最新版本 遵循非常有用的说明here http delphi
  • 如何删除 Perforce 中的工作区(使用 p4v)?

    我是 Perforce 的新手 创建了一些工作区作为熟悉它的练习 现在我想删除一些工作区 我只想删除工作区 以便它们不会出现在工作区视图的下拉列表中 do not想要对实际的仓库文件执行任何操作 谷歌搜索答案会产生 使工作区处于活动状态 的
  • 如何在docker中运行mongod后运行mongorestore

    我正在尝试使用 docker 设置一个 mongodb 服务器 让它从网络下载转储并用该信息填充它 我的问题是我可以让它运行并填充数据库 但完成后 它就会关闭 这就是我解决问题的方法 sudo u mongodb usr bin mongo
  • 无法将脚本文件添加到组件 html

    我在index html root 中有一个脚本文件引用 索引 html 这里不需要 sliderfunctions js 它包含一些关于 slider 的特定功能 所以我将它携带到 slider component html 文件 但正如
  • java 图像转换为矩阵

    有一个非常简单的 jpg 图像 我想将其转换为矩阵 但是使用 getRGB i j 指向像素会给出 ArrayIndexOutOfBounds 的运行时异常 以下代码对图像大小有限制吗 它只是显示整个图像中获得的第一个颜色代码 Buffer
  • 路由跟踪如何工作? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这看起来几乎是神奇的 为了绘制到 Internet 上某个其他节点的整个路径 traceroute 命令执行什么操作 Traceroute 将 TTL
  • Android Room,如何保存一个实体,其中变量之一是密封类对象

    我想在我的 Room 数据库中保存一个对象 其中一个变量可以是一种类型或另一种类型 我认为密封类是有意义的 所以我采取了这种方法 sealed class BluetoothMessageType data class Dbm val da
  • 如何获取和设置 ag-grid 状态?

    如何获取并重新设置 ag grid 表的状态 我的意思是 正在显示哪些列 以什么顺序 使用什么排序和过滤等 Update getColumnState 和 setColumnState 似乎接近我想要的 但我无法弄清楚应该保存和恢复状态的回
  • 取两个变量作为日期和时间并组合起来形成一个日期

    我想采用两个变量 一个代表日期 另一个代表时间 然后将它们组合起来形成一个日期 然后我想使用该组合日期和时间来检查当前日期和时间是否距组合日期和时间 24 小时或更短 game date game date game time game t
  • 如何使用 INLINE CSS 将 Excel 电子表格导出到 HTML 表格?

    我想知道如何将电子表格中的表格转换为 html 格式 而无需所有 Microsoft 特定代码 我们的网页托管在其他地方 这意味着我无权访问我们页面的一部分 我们只能将内容插入 我只是希望表格保留相同的字体 边框和格式 并将任何和所有 CS
  • JSF 2.0 View Scope 后退按钮安全吗?

    JSF 2 0 View Scope 后退按钮 安全吗 例如如果我将模型存储在 View Scope 中 并从第 1 页 第 2 页 第 3 页到第 4 页 一路修改模型对象 通过输入字段 然后按两次后退按钮返回第 2 页并进行更改 再次将
  • 如何查看sql server表中已删除的记录? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要从sql server表中查看已删除的记录 行 实际上我正在使用这个命令 DBCC LOG My
  • kaminari 和 order_by

    因此 我列出了我网站的所有成员 并按名称对他们进行分组 以便更好地组织列表 因此 在我看来 我的所有成员均按其成员姓名的第一个字母分组 例如 B Bakedfish Beercan Dan Bigmike33x C Cynicalassas
  • 列出 Notion 上集成访问的所有数据库

    有没有更有效的方法来获取所有数据库的列表 我尝试过使用https api notion com v1 databases端点 但现在已弃用 另一种选择是 search端点 但它也返回数据库中的所有记录 有人可以提供更好的方法来列出集成访问的
  • 无法读取 R 中的 shapefile

    我尝试使用以下代码在 Mac 上打开 shp 文件 library tidyverse library sf library rgeos sf trees raw lt readr read csv https raw githubuser
  • 使用 RSelenium 读取下拉菜单元素中的值

    我正在使用 RSelenium 导航到站点并与元素交互 问题 使用 RSelenium 如何读取下拉菜单中的选项列表 以便我可以识别可用的最新月份并使用它将下拉菜单设置为正确的值 On 某个网站 http jamaserv jama or
  • 使用 angularjs 在本地驱动器中上传文件

    我是 angularjs 的初学者 我读了很多关于文件上传等的内容 但找不到我将进一步描述的此案例的任何主题 我想在下面的代码中通过按钮 带有搜索名称 来选择一个文件 然后 当我们单击第二个按钮 带有上传名称 时 我选择在我制作的本地驱动器
  • 根据选择的选项更新输入值

    我正在尝试找出更新某些内容的最佳方法input值取决于从中选择的选项select 这是我想要实现的目标 我有一个显示域名详细信息的页面 我有一个表格input and select这允许更改价格 这input包含当前域名价格并允许用户输入新
  • Python 中的就地快速排序

    我必须用我选择的语言来实现作业的快速排序算法 所以我选择了 Python 在讲座中 我们被告知 QuickSort 内存效率高 因为它就地工作 即 它没有用于递归的输入数组部分的额外副本 考虑到这一点 我尝试在 Python 中实现 Qui