Python 中的快速排序实现

2024-03-22

我正在尝试在 python 中实现快速排序。但是,我的代码没有正确排序(不完全)。例如,在输入数组 [5,3,4,2,7,6,1] 上,我的代码输出 [1,2,3,5,4,6,7]。所以,最终结果插入了 4 和 5。我承认我对 python 有点生疏,因为我一直在研究 ML(并且在此之前对 python 相当陌生)。我知道快速排序的其他 python 实现,以及 Stack Overflow 上有关 python 和快速排序的其他类似问题,但我试图理解我自己编写的这段代码有什么问题:

#still broken 'quicksort'

def partition(array):
    pivot = array[0]
    i = 1 
    for j in range(i, len(array)):
        if array[j] < array[i]:
            temp = array[i]
            array[i] = array[j]
            array[j] = temp
            i += 1
    array[0] = array[i]
    array[i] = pivot
    return array[0:(i)], pivot, array[(i+1):(len(array))]

def quick_sort(array):
    if len(array) <= 1: #if i change this to if len(array) == 1 i get an index out of bound error
        return array 

    low, pivot, high = partition(array)
    #quick_sort(low)
    #quick_sort(high)

    return quick_sort(low) + [pivot] + quick_sort(high)

array = [5,3,4,2,7,6,1]

print quick_sort(array)
# prints [1,2,3,5,4,6,7]

我对算法与快速排序的联系有点困惑。在快速排序中,您通常将所有条目与主元进行比较,因此您会得到较低和较高的组; fast_sort 函数显然希望您的分区函数执行此操作。

但是,在分区函数中,您永远不会将任何内容与您命名的数据透视值进行比较。所有比较都在索引 i 和 j 之间进行,其中 j 通过 for 循环递增,如果发现某个项目无序,则 i 递增。这些比较包括对照项目本身进行检查。该算法更像是选择排序,其复杂性比冒泡排序稍差。因此,只要左侧有足够的项目,您就会得到向左冒泡的项目,第一个项目最终会在最后移动的项目所在的位置之后被转储;因为它从未与任何东西进行比较,所以我们知道如果其中还有剩余的项目,那么它一定是无序的,仅仅因为它替换了有序的项目。

再想一想,这些项目只是部分排序的,因为一旦项目被交换到左侧,您就不会返回到该项目,并且它仅针对它所替换的项目进行检查(现在发现已经乱序) )。我认为在没有索引争论的情况下编写预期的函数更容易:

def partition(inlist):
    i=iter(inlist)
    pivot=i.next()
    low,high=[],[]
    for item in i:
        if item<pivot:
            low.append(item)
        else:
            high.append(item)
    return low,pivot,high
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的快速排序实现 的相关文章

随机推荐

  • 是否可以从 DataContext.ExecuteQuery 返回匿名对象的 IEnumerable?

    我开发了一个报告引擎 其中报告基于模板 每个模板都有带有 SQL 查询的字符串 每个报告都有 SQL 查询参数的特定值 为了呈现报告 我设置参数并调用数据上下文 执行查询 http msdn microsoft com en us libr
  • npm start 上的 webpack-dev-server 错误

    我正在尝试在 ng2 admin 上运行 npm start 一切正常 直到我执行 npm update 来尝试更新软件包 之后 npm 启动并出现错误 webpack dev server config config webpack de
  • 从 Android WebView 中启动地图

    我有一个 Android 应用程序 它在 WebView 中显示内容 其中包含一个应该打开地图的链接 我有要链接的位置的纬度 经度和街道地址 但我不确定链接的正确格式 大约一周时间没有收到社区对此的任何答复或评论 最后我只是选择 http
  • D3D11 不知从何增加了引用计数?

    我已经使用 d3d11 有一段时间了 在发现 directx 调试器之后 我最近发现我的程序从所有未正确释放的 com 对象中到处泄漏内存 经过一番窥探和盯着代码几个小时后 我开发了一些方法来隔离引用计数意外增加的位置 首先 所有对象都被包
  • 在数据库中存储 JS 数组和对象

    我有一个应用程序 可以让用户用 JS 构建东西 我希望用户能够保存其工作的当前状态以重用或共享它 但他拥有的是存储在 JS 数组中的 JS 对象的集合 具有非常不同的属性 颜色 标签 x y 位置 大小等 SQL 对于该特定任务来说似乎很糟
  • Jenkins:Git 推送将触发仅针对该分支的 Jenkins 构建

    我们正在多个 Git 分支上并行工作 当推送特定的 Git 分支时 我们如何启动 Jenkins 项目 作业来触发该特定分支的构建 举个例子 我们推送一个 Git 分支 feature abc gt 这应该会触发使用 拉动该分支 featu
  • 我可以阻止 numpy.array 将元素转换为 numpy 数组吗?

    我正在尝试将以下内容转换为间隔对象的 2x2 numpy 数组 from interval import interval from the pyinterval package import numpy as np np array in
  • 在循环内附加到 numpy 数组

    我真的希望没有遗漏一些东西 之前已经澄清过 但我在这里找不到东西 这个任务看起来很简单 但我失败了 我想在 for 循环中连续将一个 numpy 数组附加到另 一个数组 step n 10 steps np empty step n 1 f
  • 如何将 groovy 变量传递给 shell 块 jenkins

    我有一个常规变量 我想将其传递给 shell 块以进行进一步处理 但我不断收到粘贴在下面的错误 stages stage First Stage echo out available variables steps script def s
  • 有什么方法可以在免费的heroku dyno上添加免费的SSL证书吗?

    我有一个 heroku 免费计划 它在带有 PointDNS 附加组件的自定义域上运行 因此它可以为 DNS 提供商提供名称服务器 如果这很重要 我已在我的自定义域 https 上启动并运行该网站 但 ssl 证书指向 herokuapp
  • 将引导面板宽度设置为文本宽度

    我是 HTML Bootstrap 新手 所以也许这相当简单 How do you set the panel width引导面板 http getbootstrap com components panels其文本的长度 如果面板无法实现
  • wsdl2py 复杂类型

    如何向 SOAP 请求添加复杂类型 我正在使用 WSDL2py 生成的请求 并尝试使用它在 types py 文件中创建的其他 TypeDefinitions 例如 AccountInfo 用于身份验证 它会进入每个请求 然后将其传递给 w
  • 基于 webkit 的浏览器将 json 解释为脚本

    我只是尝试通过 js 获取我的 Zootool 项目 将它们推送到我的博客页脚中 但没有成功 这是我使用的代码 jquery框架 jQuery document ready function first try var url http z
  • 使用 jspdf 将图像 url 转换为 pdf

    function convertImgToBase64 url var canvas document createElement canvas var ctx canvas getContext 2d img document creat
  • 编译/运行时字符串文字的原始字节流入/流出 Windows(非宽)执行字符集,以及 ANSI 代码页与 UTF-8

    我想确认我对原始字符串文字和 非宽 的理解execution character set在 Windows 上 我希望具体确认的相关段落以粗体显示 但首先 有一些背景知识 背景 相关问题见下文bold 由于下面的有益讨论 TheUndead
  • 使用 Python 函数并生成所有导数

    我有一个参数数量可变的 python 函数 F x1 x2 xN 我想自动生成 N 个函数 表示 F 对每个参数的导数 F 1 dF dx1 F 2 dF dx2 F N dF dxN 例如 我可以同时提供 F x1 sin x1 和 F
  • C,从单个输入行读取多个数字(scanf?)

    我用 C 编写了一个应用程序 需要输入两行 第一个输入告诉 int 数组有多大 第二个输入包含由空格分隔的值 例如 输入以下内容 5 1 2 3 4 99 应该创建一个包含 1 2 3 4 99 最快的方法是什么 我的问题是读取多个数字而不
  • 在 WP7 上将 PivotItem 数据绑定到 ObservableCollection

    我想将 ObservableCollection 数据绑定到 WP7 中的 Pivot 控件 以便 ObservableCollection 中的每个对象都成为 PivotItem 这是我使用的代码
  • JavaScript 全局变量在函数内变为未定义

    由于某种原因 JavaScript 全局变量在函数内部变得未定义 不明白为什么 您可以复制并运行代码 正如您所看到的 全局变量 target 在第一个警报中定义 但随后在函数内变为未定义 这是代码
  • Python 中的快速排序实现

    我正在尝试在 python 中实现快速排序 但是 我的代码没有正确排序 不完全 例如 在输入数组 5 3 4 2 7 6 1 上 我的代码输出 1 2 3 5 4 6 7 所以 最终结果插入了 4 和 5 我承认我对 python 有点生疏