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 中的快速排序算法(逐步) 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P

随机推荐

  • 如何在 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 中实现它 在开始确定这些答案之前 您将需要一组数据 在许多情况下是排序数据 来执行进一步的计算