Python 中的快速排序算法(逐步)

2023-10-22

在编程世界中,大多数问题的答案都可以在存储在各种数据结构中的数据中并借助一些标准算法找到。

今天,我们将讨论快速排序算法以及如何在 Python 中实现它。

在开始确定这些答案之前,您将需要一组数据(在许多情况下是排序数据)来执行进一步的计算。

 

 

Python 中的排序算法

排序涉及根据某些计算操作来排列数据,最常见的是大于 (>) 或小于 (

它允许以特定方式排列数据,这有助于优化各种以数据为中心的操作,例如搜索。

排序可以用于多种目的,从帮助数据更具可读性到有助于更快和优化的程序。

有多种可用的排序算法可以在 Python 中实现。他们之中有一些是:

  1. Bubble Sort
    • Time Complexity: Best Case = Ω(N), Worst Case = O(N2), Average Case = Θ(N2)
    • 空间复杂度:最坏情况 = O(1)
  2. Selection Sort
    • Time Complexity: Best Case = Ω(N2), Worst Case = O(N2), Average Case = Θ(N2)
    • 空间复杂度:最坏情况 = O(1)
  3. Heap Sort
    • 时间复杂度:最佳情况 = Ω(NlogN),最坏情况 = O(NlogN),平均情况 = θ(NlogN)
    • 空间复杂度:最坏情况 = O(1)
  4. Merge Sort
    • 时间复杂度:最佳情况 = Ω(NlogN),最坏情况 = O(NlogN),平均情况 = θ(NlogN)
    • 空间复杂度:最坏情况 = O(N)
  5. Insertion Sort
    • Time Complexity: Best Case = Ω(N), Worst Case = O(N2), Average Case = Θ(N2)
    • 空间复杂度:最坏情况 = O(1)
  6. Quicksort
    • Time Complexity: Best Case = Ω(NlogN), Worst Case = O(N2), Average Case = Θ(NlogN)
    • 空间复杂度:最坏情况 = O(logN)

这些算法中的每一种都使用不同的方法来执行排序,从而导致不同的时间和空间复杂度。

可以根据程序的要求和资源的可用性来使用其中的每一种。
在列出的算法中,快速排序算法被认为是最fastest因为对于大多数输入,在平均情况下,快速排序被发现是性能最佳的算法。

 

定义

快速排序算法按照“分而治之”的原理来找到解决方案。
在每个步骤中,我们从数据中选择一个称为“枢轴”的元素,并确定其在排序数组中的正确位置。
迭代结束时,主元左侧的所有元素都小于或等于主元,右侧的所有元素都大于主元。

输入list因此,根据主元值将其划分为左(较小)列表和右(较大)列表。
我们在左右子数组上递归地重复该过程,直到获得排序列表。

source: Wikipedia

就地算法

不需要额外内存来产生输出,而是“就地”对输入执行操作以产生输出的算法称为“就地算法”。
然而,额外且通常小于线性 (O(n)) 空间的常量空间可用于变量。
在快速排序算法中,由于输入元素被简单地重新排列和就地操作以形成围绕枢轴的“高”和“低”列表,并且使用小的常数空间进行某些计算,因此它是一种就地算法。

 

快速排序是如何工作的?

让我们将快速排序过程分解为几个步骤。

  1. 选择一个枢轴。
  2. 初始化左指针和右指针,分别指向列表的左端和右端。
  3. 当左指针和右指针的值分别小于和大于枢轴时,开始将左指针和右指针向枢轴移动。
  4. 在每一步中,检查并将小于枢轴的元素放置在枢轴的左侧,将大于枢轴的元素放置在右侧。
  5. 当两个指针相遇或交叉时,我们就完成了列表的一次迭代,并且枢轴被放置在最终排序数组中的正确位置。
  6. 现在,在枢轴的两侧获得了两个新列表。
    对每个列表重复步骤 1-5,直到所有元素都放置在正确的位置。

 

快速排序:算法

上述过程可以表示为快速排序的形式化算法。
我们将执行“快速排序”,直到元素出现在列表中。

A=array

start=数组的下界

end = 数组的上限

枢轴=枢轴元素

 


1. QUICKSORT (array A, start, end)

2. {

3.  if (start >= 0 && start >= 0 && start < end)

4.  {

5.    p = partition(A, start, end)

6.    QUICKSORT(A, start, p)

7.    QUICKSORT(A, p + 1, end)

8.  }

9. }
  

观察第五步调用了一个名为partition 的函数。
我们将使用这个函数将元素放置在枢轴的两侧。
让我们看一下。


1. PARTITION (array A, start, end) 

2. { 

3.  pivot = A[(start+end)//2] 

4.  i = start 

5.  j = end 

6.  while (True) 

7.  {

8.    do i =i + 1 while A[i]<pivot 

9.    do j =j - 1 while A[j]>pivot 

10.   if i>=j then return j 

11.   swap A[i] with A[j] 

12. }

13. } 
  

在分区函数中,我们首先将数组的一个元素(此处为中间元素)分配给主元变量。
变量 i 和 j 用作左指针和右指针,它们迭代数组并用于在需要时交换值。
我们使用 while 循环以及 return 语句来确保整个数组

让我们通过一个例子来理解这个过程。
取数组 A = 3 7 8 5 2 1 9 5 4。
可以选择任何元素作为枢轴,但出于本示例的目的,我采用中间元素。

 

Step 1

开始=0,结束=8,i=0,j=8,枢轴=2
由于 a[i]a[j] > 主元为真,j-=1。重复此操作,直到 a[j] > 主元,j = 5。
将 A[i] 与 A[j] 交换,即 3 与 1。
所以 A = 1 7 8 5 2 3 9 5 4,i = 0,j = 5

 

Step 2

i=1,j=4,主元=2
由于 a[i]由于 a[j] > hub 为 false,因此不执行任何操作。
将 A[i] 与 A[j] 交换,即 7 与 2。
所以 A = 1 2 8 5 7 3 9 5 4,i = 1,j = 4

 

Step 3

i=2,j=3,主元=2
由于 a[i]由于 a[j] > 枢轴为真,因此 j-=1。重复此操作并在 j=1 处停止
由于 i=2 > j,退出 while 循环并返回 j=1。

在此步骤中,主元值 2 位于最终排序数组中的正确位置。

现在,我们对两个子数组重复上述步骤,一个子数组的 start=0,end=1,另一个子数组的 start=2,end=8。

 

执行

让我们首先在 Python 中定义配分函数。


def partition(A, start, end):
    i = start-1 #left pointer
    pivot = A[(start+end)//2] # pivot
    print(f"Pivot = {pivot}")
    j = end+1 #right pointer
    while True:
        i+=1
        while (A[i] < pivot):
            i+=1 #move left pointer to right
        j-=1
        while (A[j]> pivot):
            j-=1 #move right pointer to left
        if i>=j:
            return j #stop, pivot moved to its correct position
        A[i], A[j] = A[j], A[i] 
a = [3,7,8,5,2,4]
print(f"Input array: {a}")
p = partition(a,0,len(a)-1)
print(f"Array after partitioning:{a}")
  

Output:

请注意枢轴 8 如何从其原始位置 2 移动到最后的正确位置,使得其左侧的所有元素(即 [0:4])都小于或等于 8。

这种分区技术称为“霍尔分区”,它是更有效的分区方法。
另一种称为“Lomuto 分区”。

现在让我们看一下 Python 中快速排序的完整实现partition功能。


def quickSort(A, start, end):
    if start < end:
        p = partition(A, start, end) # p is pivot, it is now at its correct position
        # sort elements to left and right of pivot separately
        quickSort(A, start, p)
        quickSort(A, p+1, end)
A = [24, 10, 30, 13, 20, 27]
print(f"Original array A: {A}")
quickSort(A, 0, len(A)-1)
print(f"Array A after quicksort: {A}")
  

Output:

 

快速排序时间复杂度

对于大小为 n 的输入,每一步都会将其分为 k 部分和 n-k 部分。
因此,n 个元素的时间复杂度 = k 个元素的时间复杂度 + n-k 个元素的时间复杂度 + 选择主元的时间复杂度
即 T(n)=T(k)+T(n-k)+M(n)

 

最佳案例

当选择中间元素作为每个递归循环中的枢轴时,会出现最佳情况的复杂性。
每次迭代时,数组都会被分成大小相等的列表,并且随着重复此过程,排序会以尽可能少的步骤完成。
执行的递归次数将为 log(n),每一步执行 n 次操作。
因此,可得时间复杂度为O(n(log(n)).

 

最坏的情况下

In the worst-case scenario, n number of recursion operations are performed and the time complexity is O(n2).
This can occur under the following conditions:

  1. 在每一步中选择最小或最大的元素作为枢轴。
  2. 最后一个元素被选择作为基准,并且列表已经按升序或降序排列。

时间复杂度也可以使用大师定理求出。

 

平均情况

平均情况是通过考虑数组的各种排列的时间复杂度的平均值来获得的。复杂度是O(nlog(n)).

 

降序快速排序

上面的实现导致数组按升序排序。
通过交换条件的一些改变,数组也可以按降序排序。
当左侧元素大于枢轴时,不应交换左侧元素,而应在它们小于枢轴时执行交换。
类似地,当右侧元素小于主元时,不应交换它们,而应在它们大于主元时执行交换。
结果,将在其左侧创建大于主元的元素列表,并在其右侧创建小于主元的元素子数组。
最终,数组会按照从左到右从大到小的顺序排列。

 

执行


def partition_desc(A, start, end):
    i = start-1 #left pointer
    pivot = A[(start+end)//2] # pivot
    j = end+1 #right pointer
    while True:
        i+=1
        while (A[i] > pivot):
            i+=1 #move left pointer to right
        j-=1
        while (A[j]< pivot):
            j-=1 #move right pointer to left
        if i>=j:
            return j #stop, pivot moved to its correct position
        A[i], A[j] = A[j], A[i] 
a = [3,7,8,5,2,4]
print(f"Input array: {a}")
p = partition_desc(a,0,len(a)-1)
print(f"Array after partitioning:{a}")
  

Output:

现在,分区步骤可确保将主元移动到最终降序排序数组中的正确位置。
现在让我们看看它的完整快速排序实现。


def quickSort_desc(A, start, end):
    if len(A) == 1:
        return A
    if start < end:
        p = partition_desc(A, start, end) # p is pivot, it is now at its correct position
        # sort elements to left and right of pivot separately
        quickSort_desc(A, start, p-1)
        quickSort_desc(A, p+1, end)
A = [24, 10, 30, 13, 20, 27]
print(f"Original array A: {A}")
quickSort_desc(A, 0, len(A)-1)
print(f"Array A after quicksort: {A}")
  

Output:

 

快速排序空间复杂度

在快速排序算法中,分区是就地完成的。
这需要O(1) 空间.
然后对元素进行递归排序,并且对于每个递归调用,使用一个恒定大小的新堆栈帧。
将空间复杂度置于平均情况下为 O(log(n)).
这可以达到最坏情况的 O(n).

 

QuickSort的迭代实现

到目前为止,我们已经看到了快速排序算法的递归实现。可以通过迭代方法完成相同的操作。
在Python的迭代实现中,执行元素比较和交换的分区函数保持不变。
对快速排序函数中的代码进行了更改,以使用堆栈实现而不是对快速排序函数的递归调用。
这是因为创建了一个临时堆栈并将数组的第一个和最后一个索引放置在其中。
然后,当堆栈不为空时,将元素从堆栈中弹出。

让我们看一下 Python 中的代码实现。


def quickSortIterative(A, start, end):
    # Create and initialize the stack, the last filled index represents top of stack
    size = end - start + 1
    stack = [0] * (size)
    top = -1
    # push initial values  to stack
    top = top + 1
    stack[top] = start
    top = top + 1
    stack[top] = end
    # Keep popping from stack while it is not empty
    while top >= 0:
        # Pop start and end
        end = stack[top]
        top = top - 1
        start = stack[top]
        top = top - 1
        # Call the partition step as before
        p = partition( A, start, end )
        # If the left of pivot is not empty,
        # then push left side indices to stack
        if p-1 > start:
            top = top + 1
            stack[top] = start
            top = top + 1
            stack[top] = p - 1
        # If the right of pivot is not empty,
        # then push the right side indices to stack
        if p + 1 < end:
            top = top + 1
            stack[top] = p + 1
            top = top + 1
            stack[top] = end
A = [9,1,9,2,6,0,8,7,5]
print(f"Input array: {A}")
n = len(A)
quickSortIterative(A, 0, n-1)
print (f"Sorted array:{A}")

  

Output:

当堆栈不为空时,元素将从堆栈中弹出。
在这个 while 循环中,枢轴元素在分区函数的帮助下移动到正确的位置。
堆栈用于借助第一个和最后一个元素的索引来跟踪低列表和高列表。
从堆栈顶部弹出的两个元素表示子列表的开始索引和结束索引。
对形成的列表迭代执行快速排序,直到堆栈为空并获得排序列表。

 

快速排序的效率

当数据集较小时,快速排序算法具有更好的效率。
随着数据集大小的增加,效率会降低,对于较大的数据集,不同的排序算法(例如合并排序)可能会更有效。

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

Python 中的快速排序算法(逐步) 的相关文章

  • 从 RabbitMQ 迁移到 Amazon SQS [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的初创公司目前正在使用RabbitMQ with Python Django 对于消息队列 现在我们计划转移到Amazon SQS其高可用性
  • 错误列表索引必须是整数,而不是列表。获取一个数组的值,使用它们作为索引来删除另一个数组中的值

    seen dups collections defaultdict list for i item in enumerate prules for j orig in enumerate seen if item orig dups j a
  • DRF ManyToMany Field 在创建对象时出现错误

    我有一个Rant模型与Category使用链接到它ManyToManyField 我已经序列化了它 但问题是这个错误 categories Expected a list of items but got type str 这些是我的序列化
  • 添加图例到散点图

    这个问题已经被问到了 但我想找到一个更清晰的解决方案 给定 X 是 100x2 数据 标签是标签向量 从 1 到 9 我绘制散点图如下 pl scatter X 0 X 1 c labels pl show 如何仅用一行代码添加图例来解释颜
  • 在 Python 中打开 Alteryx .yxdb 文件?

    有没有办法将 yxdb Alteryx 数据库文件 导入到 Pandas Python 中 而不使用 Alteryx 作为中间人 简短的回答是否定的 目前还不行 更长的答案 yxdb 支持的原始 C 是可以在 github 上找到 http
  • 使用非负约束进行优化

    考虑以下功能 import numpy as np import scipy optimize as opt import math Periodic indexation def pl list i return list i len l
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • python 队列获取大小,使用 qsize() 还是 len()?

    我见过这样的例子qsize and len 已用于计算队列的大小 两者有什么区别 对于大多数容器 您需要len but Queue Queue实际上并不支持len 这可能是因为它很旧 或者因为在多线程环境中获取队列的长度并不是特别有用 无论
  • 从日志文件 python 创建 csv 标题

    我的日志文件每行都包含一些信息 如下所示 Info1 NewOrder key 123 Info3 10 Info5 abc Info3 10 Info1 OldOrder key 456 Info6 xyz Info1 NewOrder
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • scrapy蜘蛛如何将值返回给另一个蜘蛛

    我正在爬行的网站包含许多玩家 当我点击任何玩家时 我都可以进入他的页面 网站结构是这样的
  • 按共同日期对数组数据进行排序

    我有一个包含许多行和 3 列的 csv 文件 日期 代表和销售额 我想使用 Python 生成一个新数组 该数组按日期对数据进行分组 并且对于给定日期 按销售额对代表进行排序 例如 我的输入数据如下所示 salesData 201703 B
  • Django 视图中的原始 SQL 查询

    我将如何使用原始 SQL 执行以下操作views py from app models import Picture def results request all Picture objects all yes Picture objec
  • 树莓派上的 /dev/mem 访问被拒绝

    我正在使用我的 Raspberry Pi 并且正在编写一个 cgi python 脚本 该脚本创建一个网页来控制我的 gpio 输出引脚 当我尝试将 RPi GPIO 作为 GPIO 导入时 我的脚本崩溃了 这是我收到的错误 File co
  • 在Python中寻找坐标系中某些点之间的最短路径

    我编写了一个代码 可以在坐标系中的特定宽度和长度范围内生成所需数量的点 它计算并列出我使用欧几里德方法生成的这些点的距离矩阵 我的代码在这里 import pandas as pd from scipy spatial import dis
  • 在此异步设置中,我在哪里捕获 KeyboardInterrupt 异常

    我正在开发一个使用ccxt异步库 它要求通过显式调用该类的资源来释放某个类使用的所有资源 close 协程 我想退出程序ctrl c并等待异常中的关闭协程 然而 它永远不会被等待 该应用程序由模块组成harvesters strategie
  • 采用迭代器而不是可迭代的方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 关于迭代器和可迭代对象 仅是我的观察 如果我错了 请纠正我 大多数构造函数 数组类型 将迭代器作为质量构造函数 迭代器是显式创建的 或
  • 使用不同的 CMD 名称同时运行多个 python 脚本

    我尝试通过 multiprocessing Process 在 test py 中同时调用 a py 和 b py 它起作用了 但过程CMDa py b py 和 test py 的名称相同 均为 usr bin python tmp te
  • 用python在pygame中制作一个8*8的棋盘

    我想用 python 在 pygame 中制作一个棋盘 只是带有 for 循环的棋盘 我尝试了多种方法来做到这一点 但我不知道它到底是什么 这是我的代码 import pygame pygame init set color with rg
  • Python记录多个模块记录器在主程序之外不起作用

    我的目标是从多个模块进行日志记录 同时仅在一个位置 主程序中 配置记录器 如图所示这个答案 https stackoverflow com questions 15727420 using python logging in multipl

随机推荐

  • 如何在 Ubuntu 20.04 上安装 OpenCV

    OpenCV 开源计算机视觉库 是一个开源计算机视觉库 绑定了 C Python 和 Java 并支持所有主要操作系统 它可以利用多核处理并具有 GPU 加速功能来实现实时操作 OpenCV 的应用范围很广 包括医学图像分析 拼接街景图像
  • 如何在 Debian 10 Linux 上添加交换空间

    交换空间是磁盘上的空间 当物理内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 运行 Debian 虚拟机时不存在交换分区 因此唯一的选择是创建交
  • 如何在 CentOS 8 上安装 Apache Maven

    Apache Maven 是一个开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 在本教程中 我们将解释如何在 Cent
  • 如何在 Ubuntu 18.04 上安装 TensorFlow

    TensorFlow是由 Google 构建的免费开源机器学习平台 许多组织都在使用它 包括 Twitter PayPal 英特尔 联想和空中客车公司 TensorFlow 可以在 Python 虚拟环境中安装在系统范围内 作为Docker
  • Linux 中的 Chattr 命令(文件属性)

    在 Linux 中 文件属性是描述文件行为的元数据属性 例如 属性可以指示文件是否被压缩或指定文件是否可以被删除 一些属性 如不变性 可以设置或清除 而其他属性 如加密 是只读的 只能查看 对某些属性的支持取决于所使用的文件系统 本文介绍了
  • 在Ubuntu上安装RPM包

    Ubuntu 存储库包含数千个 deb 软件包 可以从 Ubuntu 软件中心或使用apt命令行实用程序 Deb 是所有基于 Debian 的发行版 包括 Ubuntu 都使用的安装包格式 有些软件包在标准 Ubuntu 存储库中不可用 但
  • 如何检查PHP版本

    PHP 是最常用的服务器端编程语言之一 PHP 版本之间存在一些重要差异 因此在某些情况下可能需要了解您的服务器上运行的是哪个版本 例如 如果您在开始安装之前升级应用程序或安装需要特定 PHP 版本的新应用程序 则需要找出 PHP 服务器的
  • 如何在 Debian 10 Linux 上安装 Google Chrome 网络浏览器

    谷歌浏览器是世界上最流行的网络浏览器 它是专为现代网络打造的快速 直观且安全的浏览器 Chrome 不是开源浏览器 并且不包含在官方 Debian 存储库中 它是基于Chromium 一个开源浏览器 可在默认 Debian Buster 存
  • 如何在 Ubuntu 中将用户添加到 Sudoers

    sudo是一个命令行程序 允许受信任的用户以 root 或其他用户身份执行命令 在本文中 我们将向您展示两种向用户授予 sudo 权限的方法 第一个是将用户添加到sudoers 文件 该文件包含控制向哪些用户和组授予 sudo 权限以及权限
  • 检查 gzip 文件而不解压缩:zcat、zless 和 zmore

    Linux 提供了多个用于处理压缩文件的命令 例如 zcat zless 和 zmore 本教程将深入探讨这些命令的用法 让您可以导航和检查压缩文件 而无需解压缩它们 下表总结了这 3 种工具之间的差异 Tool Description P
  • 使用 source 命令在 Linux 中获取脚本

    The sourceLinux 中的 command 是一个内置的 shell 命令 用于从文件中读取和执行命令 这意味着脚本定义的任何变量或函数在脚本执行完成后仍然可用 现在 让我们开始探索它的功能source命令 目录 hide 1 子
  • Linux 上的 MySQL(初学者教程)

    在这篇文章中 我们将介绍 Linux 上 MySQL 的许多方面 首先 如何安装它 如何执行基本的 CRUD 操作 如何导入和导出数据 如何使用 MySQL 引擎本身 例如设置 root 用户密码 等等 MySQL 是世界上最流行的关系数据
  • 将 NumPy 数组转换为 Pandas DataFrame(15+ 场景)

    通常我们需要在 NumPy 数组中创建数据并将其转换为 DataFrame 因为我们必须处理 Pandas 方法 在这种情况下 转换NumPy 数组 ndarrays 到数据框使我们的数据分析变得方便 在本教程中 我们将仔细研究一些可用于将
  • 使用 Python 发送电子邮件(多个示例)

    Python 允许您使用其内置模块自动执行发送电子邮件的任务 这样做可以让您摆脱手动向数千名用户发送电子邮件的繁琐且耗时的任务 本教程将探讨一些快速 简单的发送电子邮件和使用 Python 内置电子邮件模块的方法 目录 hide 1 检查电
  • Python 中的深度优先搜索算法(多个示例)

    深度优先搜索是一种流行的图遍历算法 在本教程中 我们将通过示例了解它的工作原理 以及我们如何用 Python 实现它 我们将研究以下部分 目录 hide 1 介绍 2 深度优先搜索算法 3 Representing a graph
  • Python NumPy 数组教程

    NumPy 是一个 Python 库 模块 用于科学计算Python编程 在本教程中 您将学习如何对 NumPy 数组执行多种操作 例如以多种方式添加 删除 排序和操作元素 NumPy 提供多维数组对象和其他派生数组 例如屏蔽数组或屏蔽多维
  • 关于 Linux 导出命令您需要了解的一切

    The exportLinux中的命令是一个内置的shell命令 用于设置环境变量在当前 shell 会话中 通过标记变量或函数以便随后导出到子进程的环境中 export命令确保这些变量对子进程的可用性 目录 hide 1 导出命令的语法
  • 安装、配置和使用 Linux NIS 服务器

    我们使用 Linux NIS 服务器 网络信息服务 用于在网络上的系统之间共享存储在平面文件中的关键数据 通常理想的做法是使用共享存储库 例如 NIS 来存储用户和组信息 而不是将它们存储在 etc passwd 等平面文件中 那么这样做有
  • NumPy Meshgrid 从零到英雄

    Python 的 NumPy是处理数组 矩阵数据最常用的库 矩阵可以被视为二维值 网格 其中网格中每个值的位置由一对值 i j 给出 这些值表示该值在网格中的行号和列号 在本教程中 我们将了解如何使用 Python 中的 NumPy 库创建
  • Python 中的快速排序算法(逐步)

    在编程世界中 大多数问题的答案都可以在存储在各种数据结构中的数据中并借助一些标准算法找到 今天 我们将讨论快速排序算法以及如何在 Python 中实现它 在开始确定这些答案之前 您将需要一组数据 在许多情况下是排序数据 来执行进一步的计算