摘要:在编程里,排序是一个重要算法,它可以帮助我们更快、更容易地定位数据。在这篇文章中,我们将使用排序算法分类器对我们的数组进行排序,了解它们是如何工作的。

本文分享自华为云社区《Python 排序算法指南》,原文作者:唐里 。

在编程里,排序是一个重要算法,它可以帮助我们更快、更容易地定位数据。在这篇文章中,我们将使用排序算法分类器对我们的数组进行排序,了解它们是如何工作的。为了保障本文的可读性,这里只着重介绍4个排序算法。

  • 冒泡排序
  • 插入排序.
  • 归并排序.
  • 快速排序

冒泡排序

冒泡排序是一种简单的排序算法,它比较两个相邻对象的顺序,将非预期顺序的相邻对象位置交换。下面是它的工作步骤:

  • 比较第一个和第二个对象,如果第一个大于第二个,将之交换。
  • 将第二个对象和第三个对象进行比较,检查相同条件。以此类推直到比较到数组最后一个数。
  • 重复执行这个过程,这样数组就按照从左到右从小到大排列了。

代码如下

# Python中的冒泡排序
def bubbleSort(array): # 外循环访问数组的每个元素
for i in range(len(array)): # 内循环将数组元素与外循环迭代元素进行比较
for j in range(0, len(array) - i - 1): # 比较两个相邻元素
if array[j] > array[j + 1]: # 如果元素不是预期顺序则交换元素
temp = array[j]
array[j] = array[j+1]
array[j+1] = temp
data = [5, 4, 3, 2, 1] bubbleSort(data)
print('Sorted Array')
print(data) #output: [1, 2, 3, 4, 5]

插入排序

插入排序也很简单,它分为已经排序和未排序两部分,将未排序部分的元素选中后正确放置在排序部分即可。类似卡牌游戏时我们手里有分类卡。下面是它的工作步骤:

  • 遍历数组查找最低元素的索引并将其与数组的第一个元素交换。
  • 找到数组(不包括第一个元素)中另一个最低的元素,并将其与第二个元素交换 ,然后重复操作,直到数组的最后一个元素。
  • 这样,数组中最低的元素都会移到左边,而最大的元素会在数组的右边,因此数组是有序的。

代码如下

# Python中的排序算法
def insertionSort(array):
for step in range(1, len(array)):
key = array[step]
j = step - 1
# 将键与其左侧的每个元素进行比较,直到找到小于它的元素
while j >= 0 and key < array[j]:
array[j + 1] = array[j]
j = j - 1
# 将键放在比它小的元素之后。
array[j + 1] = key data = [11, 4, 3, 2, 12] insertionSort(data)
print("sorted array")
print(data) #output: [2, 3, 4, 11, 12]

归并排序

归并排序是基于分治算法原理的最常用的排序算法。我们将数组分为多个部分,然后对他们进行排序,最后将子部分合并为一个排序数组,为了更好的理解,下面是它的工作步骤:

  • 把数组分成小块,直到每一块中没有单独的元素。
  • 比较每一块数组,将最小值放在左侧,最大值放在数组的右侧。
  • 如果觉得很难理解,看看这个动图。

代码如下

# Python的归并排序
def mergeSort(array):
if len(array) > 1: # r 是将数组分为两半后的分割点
r = len(array)//2
L = array[:r]
M = array[r:] # 通过递归方法对两半进行排序
mergeSort(L)
mergeSort(M) i = j = k = 0 # 直到我们到达 L 或 M 的任一端,从中选择较大的元素 L 和 M 并将它们放置在 A[p 到 r] 处的正确位置
while i < len(L) and j < len(M):
if L[i] < M[j]:
array[k] = L[i]
i += 1
else:
array[k] = M[j]
j += 1
k += 1 # 将L或者M里的元素排序好后,将剩余的元素并放入 A[p to r]
while i < len(L):
array[k] = L[i]
i += 1
k += 1 while j < len(M):
array[k] = M[j]
j += 1
k += 1
array = [8, 6, 14, 12, 10, 3] mergeSort(array)
print("Sorted array: ")
print(array) #output: [3, 6, 8, 10, 12, 14]

快速排序

与归并排序一样,快速排序也是基于分治算法的原理的一种排序算法。它选择一个元素作为枢轴,并围绕枢轴分区数组。下面是它的工作步骤:

  • 选择一个转折点,这可以是随机选择的。这里假设我们选择数组的最后一个元素作为轴心。
  • 将所有小于轴心的项目放在左侧,大于轴心的项目放在数组右侧。
  • 在枢轴的左右两侧重复上面的步骤。

# Python中的快速排序
# 找到分区位置
def partition(array, lowest, highest): # 这里我们选择最右的元素作为枢轴
pivot = array[highest] # 为最大的元素设置指针
i = lowest - 1
# 将每个元素与枢轴元素对比
for j in range(lowest, highest):
if array[j] <= pivot:
i = i + 1
# 将 i 处的元素与 j 处的元素交换
(array[i], array[j]) = (array[j], array[i]) # 将枢轴元素与 i 指定的较大元素交换
(array[i + 1], array[highest]) = (array[highest], array[i + 1]) # 返回分区完成的位置
return i + 1
def quickSort(array, lowest, highest):
if lowest < highest: # 找到枢轴元素
# 小于枢轴的元素放左边
# 大于枢轴的元素放右边
pi = partition(array, lowest, highest) # 枢轴左侧的递归调用
quickSort(array, lowest, pi - 1) # 枢轴右侧的递归调用
quickSort(array, pi + 1, highest)
array = [9, 8, 3, 2, 1, 10, 7, 6, 19] size = len(array)
quickSort(array, 0, size - 1)
print('Sorted Array is below')
print(array) #output [1, 2, 3, 6, 7, 8, 9, 10, 19]

以上就是本文的全部内容,感谢阅读,如果对你有帮助希望点个赞~

原文地址:https://python.plainenglish.io/a-guide-to-sorting-algorithms-in-python-dfa9436b8527

点击关注,第一时间了解华为云新鲜技术~

带你掌握4种Python 排序算法的更多相关文章

  1. 44.python排序算法(冒泡+选择)

    一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...

  2. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...

  3. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  4. php四种基础排序算法的运行时间比较

    /** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...

  5. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  6. PHP四种基本排序算法

    PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数 ...

  7. 七种经典排序算法及Java实现

    排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...

  8. php四种基础排序算法的运行时间比较!

    /** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...

  9. python排序算法实现(冒泡、选择、插入)

    python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...

随机推荐

  1. CentOS7 / CentOS8 设置终端屏幕分辨率

    Centos7 修改文件 /boot/grub2/grub.cfg 搜索 linux16 / /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=881ac4e6-4a5 ...

  2. [bug] docker:write /var/lib/docker/tmp/GetImageBlob613162680: no space left on device

    原因 分区空间不够,无法安装镜像 参考 https://www.cnblogs.com/elizwy/p/7722898.html https://blog.csdn.net/TinyJian/art ...

  3. [DB] SQL 必知必会

    整体架构 数据类型 文本类:CHAR.VARCHAR(可变长度字符,多使用).TEXT.LONGTEXT(文本较大时使用) 数字类:TINYINT.INT.BIGINT.FLOAT.DOUBLE 日期 ...

  4. Docker------阿里云部署私有镜像仓库

    Docker------阿里云部署私有镜像仓库   前言 公共镜像仓库 官方:https://hub.docker.com/ 基于各个软件开发或者软件提供方开发的 非官方:其它组织或公司开发的镜像,供 ...

  5. traceroute排查网络故障 www.qq.com排查网络故障网络不通 先ping自己

    网络不通 先ping自己 在ping网关 再ping外网 再ping别人的ip 背景需求 Linux 因为其强大的网络处理能力,被广泛用于网关(实例链接)和服务器(实例链接).实际工作中,快速排查这些 ...

  6. Tomcat修改jdk版本

    tomcat修改jdk版本 修改tomcat bin目录下的catalina.sh和setclasspath.sh文件,添加以下内容 export JAVA_HOME=/home/nodemanage ...

  7. [转发]PotPlayer 无损截取视频片段

    PotPlayer 无损截取视频片段 2019-03-29 21:04:21 ForeverStrong 阅读数 2928  收藏 更多 分类专栏: 视频图像编辑   PotPlayer 无损截取视频 ...

  8. 054.Python之Ubuntu安装Pycharm

    在学习Django的时候,开始使用的是centos,但是在做的时候,有一个错误,换一个ubuntu环境,安装一个pycharm进行学习开发 1. 下载PyCharm安装包 进入官网下载包 下载后 2. ...

  9. 测试开发:从0到1学习如何测试API网关

    本文来自我的一名学员分享 日常工作中,难免会遇到临危受命的情况,虽然没有这么夸张,但是也可能会接到一个陌生的任务,也许只是对这个概念有所耳闻.也许这个时候会感到一丝的焦虑,生怕没法完成领导交给的测试任 ...

  10. Java核心技术卷阅读随笔--第2章【Java 程序设计环境】

    Java 程序设计环境 本章主要介绍如何安装 Java 开发工具包( JDK ) 以及如何编译和运行不同类型的程序: 控制台程序. 图形化应用程序以及 applet.运行 JDK 工具的方法是在终端窗 ...