iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python怎么实现常用的五种排序算法
  • 634
分享到

python怎么实现常用的五种排序算法

2023-06-20 21:06:23 634人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关python怎么实现常用的五种排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、冒泡排序原理:比较相邻的元素。如果第一个比第二个大就交换他们两个每一对相邻元素做同样的工

这篇文章将为大家详细讲解有关python怎么实现常用的五种排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、冒泡排序

原理:

  1. 比较相邻的元素。如果第一个比第二个大就交换他们两个

  2. 每一对相邻元素做同样的工作,直到结尾最后一对

  3. 每个元素都重复以上步骤,除了最后一个

python怎么实现常用的五种排序算法

将乱序中的最大值找出,逐一移到序列最后的位置

alist = [3, 5, 9, 2, 1, 7, 8, 6, 4]def bubble_sort(alist):    # 找最大值的方式是通过对列表中的元素进行两两比较,值大的元素逐步向后移动    # 序列中有n个元素,两两比较的话,需要比较n-1次    for i in range(len(alist) - 1):  # 循环n-1次,控制两两比较的次数        if alist[i] > alist[i + 1]:            # 如果前面的元素大于后面的元素,交换两个元素的位置,否则不做任何操作            alist[i], alist[i + 1] = alist[i + 1], alist[i]    return alistprint(bubble_sort(alist))# 输出:最大值已经移动到最右边了[3, 5, 2, 1, 6, 7, 8, 4, 9]

当上述代码已经可以将序列中的最大值放置到合适的位置,然后我们就可以将上述操作继续作用到 n-1 和元素对应的新序列,则就可以将 n-1 个元素对应的最大值放置到了 n-1 和元素的最后位置。

结论:发现如果将上述的操作逐步的作用 n-1 此就可以将整个序列变成有序的。

将第一步的操作继续作用 n-1 次

alist = [3, 5, 9, 2, 1, 7, 8, 6, 4]def bubble_sort(alist):    for j in range(len(alist)-1):   # 外层循环次数递增,内层循环次数递减        for i in range(len(alist) - 1-j):  # 循环次数需要递减-j,控制两两比较的次数            if alist[i] > alist[i + 1]:                # 如果前面的元素大于后面的元素,交换两个元素的位置,否则不做任何操作                alist[i], alist[i + 1] = alist[i + 1], alist[i]    return alistprint(bubble_sort(alist))# 输出[1, 2, 3, 4, 5, 6, 7, 8, 9]

二、选择排序

思路:

  1. 首先在序列中找到最大(小)元素,存放到序列的最后

  2. 在从剩余的序列元素中继续找最大(小)的元素,放到序列中上一个最大值的前一个位置

  3. 重复第二步,直到所有元素排序完毕

将乱序中的元素两两比较,找出最大值,然后直接将最大值放置到序列最后的位置(将最大值直接和最后一个元素交换位置)

def select_sort(alist):    max_index = 0  # 最大值元素的下标,一开始假设下标为0的元素为最大值    for i in range(len(alist) - 1):  # 循环控制两两比较的次数        # 如果在比较的过程中发现,下标为max_index不是最大值,那么就改变max_index        if alist[max_index] < alist[i + 1]:            max_index = i + 1    # 循环结束后max_index就一定是最大值的下标,并且把该数和最后一个值做交换    alist[len(alist) - 1], alist[max_index] = alist[max_index], alist[len(alist) - 1]    return alistalist = [3, 5, 9, 2, 1, 7, 8, 6, 4]print(select_sort(alist))# 输出[3, 5, 4, 2, 1, 7, 8, 6, 9]

将第一步继续作用 n-1 次

def select_sort(alist):    for j in range(len(alist) - 1):# 外层循环递增n-1次        max_index = 0  # 最大值元素的下标,一开始假设下标为0的元素为最大值        for i in range(len(alist) - 1 - j):  # 内层循环递减,循环控制两两比较的次数            # 如果在比较的过程中发现,下标为max_index不是最大值,那么就改变max_index            if alist[max_index] < alist[i + 1]:                max_index = i + 1        # 循环结束后max_index就一定是最大值的下标,并且把该数和最后一个值做交换        alist[len(alist) - 1 - j], alist[max_index] = alist[max_index], alist[len(alist) - 1 - j]    return alistalist = [3, 5, 9, 2, 1, 7, 8, 6, 4]print(select_sort(alist))

三、插入排序

思路:

  • 需要将原始序列分为两个部分:有序部分、无序部分。

  • 将无序部分中的元素逐一插入到有序部分中

注意:初始情况下,有序部分为乱序序列中的第一个元素,无序部分为乱序序列的 n-1 个元素

例如:

# 乱序序列:[8,3,5,7,6][8,    3,5,7,6] # 8就是初始的有序部分,3、5、7、6就是初始的无序部分[3,8,    5,7,6][3,5,8,    7,6][3,5,7,8,    6][3,5,7,6,8,   ]

定义一个变量 i ,i 表示的是有序部分元素的个数和无序部分第一个元素小标

alist = [8, 3, 1, 6, 7]i = 1  # i 就是有序部分元素的个数和无序部分第一个元素下标# alist[i-1]:有序部分最后一个元素下标# alist[i]:无序部分第一个元素下标if alist[i - 1] > alist[i]:    alist[i], alist[i - 1] = alist[i - 1], alist[i] # [3, 8,    1, 6, 7]

循环作用到每个元素中

alist = [8, 3, 1, 6, 7]i = 2# alist[i-1]:有序部分最后一个元素下标# alist[i]:无序部分第一个元素下标while i > 0:    if alist[i - 1] > alist[i]:        # 循环第一次时[3,1,8,   6,7]        alist[i], alist[i - 1] = alist[i - 1], alist[i]        i -= 1        # 循环继续        # [1,3,8,   6,7]    else:        break

处理变量 i,需要让 i 进行自己递增

for i in range(1, len(alist)): # i = [1,2,3,4]    # alist[i-1]:有序部分最后一个元素下标    # alist[i]:无序部分第一个元素下标    while i > 0:        if alist[i - 1] > alist[i]:            alist[i], alist[i - 1] = alist[i - 1], alist[i]            i -= 1        else:            break

完整代码:

def insert_sort(alist):    for i in range(1, len(alist)):        while i > 0:            if alist[i - 1] > alist[i]:                alist[i - 1], alist[i] = alist[i], alist[i - 1]                i -= 1            else:                break    return alist

四、希尔排序

关键变量:增量gap

gap:初始值为 len(alist) // 2

  • 表示分组的组数

  • 每一组数据之间的间隔

插入排序就是增量为 1 的希尔排序

python怎么实现常用的五种排序算法

将插入排序代码写出

def hill_sort(alist):    for i in range(1, len(alist)):        while i > 0:            if alist[i - 1] > alist[i]:                alist[i - 1], alist[i] = alist[i], alist[i - 1]                i -= 1            else:                break    return alist

在插入排序代码中加入增量的概念

def hill_sort(alist):    gap = len(alist) // 2  # 初识增量        # 将插入排序中的增量1替换成gap    # 由增量1变成了增量为gap了    for i in range(gap, len(alist)):        while i > 0:            if alist[i - gap] > alist[i]:                alist[i - gap], alist[i] = alist[i], alist[i - gap]                i -= gap            else:                break    return alist

在第二步中进行增量的缩减(增量缩减到1结束)完整代码

def hill_sort(alist):    gap = len(alist) // 2  # 初识增量    while gap >= 1:        for i in range(gap, len(alist)):            while i > 0:                if alist[i - gap] > alist[i]:                    alist[i - gap], alist[i] = alist[i], alist[i - gap]                    i -= gap                else:                    break        gap //= 2  # 缩减增量    return alist

五、快速排序

思路:

  1. 将列表中第一个元素设定为基准数字,赋值给mid变量,然后将整个列表中比基准小的数值放在基准的左侧,比基准大的数字放在基准右侧,然后将基准数字左右两侧的序列在根据此方法进行排放

  2. 定义两个指针,low 指向最左侧,high 指向最右侧

  3. 然后对最右侧指针进行向左移动,移动法则是,如果指针指向的数值比基准小,则将指针指向的数字移动到基准数字原始位置,否则继续移动指针。

  4. 如果最右侧指针指向的数值移动到基准位置时,开始移动最左侧指针,将其向右移动,如果该指针指向的数值大于基准侧将该数值移动到最右侧指针指向的位置,然后停止移动。

  5. 如果左右侧指针重复则,将基准放入左右指针重复的位置,则基准左侧为比其小的数值,右侧为比其大的数值

核心操作,将基数 mid 放置到序列中间,使得基数左侧都是比它小的,右侧是比它大的

def quick_sort(alist):    low = 0  # 第一个元素下标    high = len(alist) - 1  # 最后一个元素下标    mid = alist[low]  # 基数:初始值为序列中的第一个数值    while low != high:        # 先移动high        while low < high:            if mid < alist[high]:  # 下标high对应的值大于mid,high就向右偏移1                high = high - 1            else:                # 否则,就把将high指向的数值放置到左侧下标为low对应的空位                alist[low] = alist[high]                break  # 传递后high下标偏移结束        # 开始移动low        while low < high:            if mid > alist[low]:  # 下标low对应的值小于mid,low就向左偏移1                low = low + 1            else:                # 否则,就把将low指向的数值放置到左侧下标为high对应的空位                alist[high] = alist[low]                break  # 并结束    # 最后当low和high相等的时候,那么就把mid传给下标为low或high的位置    alist[low] = mid    return alistalist = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]print(quick_sort(alist))# 输出——>6左边都是比6小的,右边都是比6大的[5, 1, 2, 4, 3,    6,    9, 7, 10, 8]

将第一步的核心操作递归作用到基数的左右两侧的子序列中

# 那么如何区分根据基数拆分出的左右子序列呢?可以通过传入指定的left和right来指定不同的子序列def quick_sort(alist, left, right):    low = left  # 第一个元素下标    high = right  # 最后一个元素下标    if low > high:  # 递归结束条件,low是不能大于high的        return    mid = alist[low]  # 基数:初始值为序列中的第一个数值    while low != high:        # 先移动high        while low < high:            if mid < alist[high]:  # 下标high对应的值大于mid,high就向右偏移1                high -= 1            else:                # 否则,就把将high指向的数值放置到左侧下标为low对应的空位                alist[low] = alist[high]                break  # 传递后high下标偏移结束        # 开始移动low        while low < high:            if mid >= alist[low]:  # 下标low对应的值小于mid,low就向左偏移1                low += 1            else:                # 否则,就把将low指向的数值放置到左侧下标为high对应的空位                alist[high] = alist[low]                break  # 并结束    # 最后当low和high相等的时候,那么就把mid传给下标为low或high的位置    if low == high:        alist[low] = mid    # 上述为核心操作,需要将核心操作递归作用到左右子序列中    quick_sort(alist, left, low - 1)  # 递归到左侧序列中    quick_sort(alist, high + 1, right)  # 递归到右侧序列中    return alistalist = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]print(quick_sort(alist, 0, len(alist) - 1))# 输出[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

关于“Python怎么实现常用的五种排序算法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: python怎么实现常用的五种排序算法

本文链接: https://www.lsjlt.com/news/300031.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python怎么实现常用的五种排序算法
    这篇文章将为大家详细讲解有关python怎么实现常用的五种排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、冒泡排序原理:比较相邻的元素。如果第一个比第二个大就交换他们两个每一对相邻元素做同样的工...
    99+
    2023-06-20
  • python如何实现常用的五种排序算法详解
    目录一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、快速排序 总结一、冒泡排序 原理: 比较相邻的元素。如果第一个比第二个大就交换他们两个 每一对相邻...
    99+
    2024-04-02
  • python中几种常用的排序算法
    这篇文章主要介绍“python中几种常用的排序算法”,在日常操作中,相信很多人在python中几种常用的排序算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中几...
    99+
    2024-04-02
  • c语言实现的几种常用排序算法
    概述 最近重新回顾了一下数据结构和算法的一些基本知识,对几种排序算法有了更多的理解,也趁此机会通过博客做一个总结。 1.选择排序-简单选择排序 选择排序是最简单的一种基于O(n2)时...
    99+
    2024-04-02
  • python常用的各种排序算法原理与实现方法小结
    1. 冒泡排序(Bubble Sort) 基本思想:重复地遍历待排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就交换位置,直到没有需要交换的元素为止。 实现代码: def b...
    99+
    2023-05-17
    python 排序算法
  • Java常用的八种排序算法与代码实现
    目录1.直接插入排序2.希尔排序3.简单选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.基数排序1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列...
    99+
    2024-04-02
  • Python实现排序方法常见的四种
    1.冒泡排序,相邻位置比较大小,将比较大的(或小的)交换位置 def maopao(a): for i in range(0,len(a)): for j...
    99+
    2024-04-02
  • python 常用的排序算法
    1.插入排序:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序;首先将第一个作为已经排好序的,然后每次从后的取出插入到前面并排序; def insert_sor...
    99+
    2023-01-30
    算法 常用 python
  • 用JavaScript实现的七种排序算法
    这篇文章主要讲解了“用JavaScript实现的七种排序算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用JavaScript实现的七种排序算法”吧!目录前言冒泡排序基础算法第二种写法是在...
    99+
    2023-06-20
  • Golang怎么实现常见排序算法
    这篇文章主要介绍“Golang怎么实现常见排序算法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang怎么实现常见排序算法”文章能帮助大家解决问题。五种基础排序算法对比五种基础排序算法对比1、...
    99+
    2023-06-30
  • Java实现几种常见排序算法代码
    稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。 排序算法分类 常见的有插入(插入排序/...
    99+
    2022-11-15
    Java 排序算法
  • Java常见排序算法怎么实现
    本文小编为大家详细介绍“Java常见排序算法怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java常见排序算法怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。汇总:1. 冒泡排序每轮循环确定最值;...
    99+
    2023-06-29
  • python排序算法之选择排序怎么实现
    一、前言初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。虽然它们的效率相对于高级排序算法偏低,但是在了解初级排序算法之后,再去学习相对复杂的高级排序算法会容易许多。二、描述选择排序表示从无...
    99+
    2023-05-17
    Python
  • JavaScript怎么实现四种常用排序
    小编给大家分享一下JavaScript怎么实现四种常用排序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、插入排序插入排序有直接插入排序,折半插入排序,希尔排序,这里只实现常用的直接插入排序直接插入排序将左侧序列看成一个...
    99+
    2023-06-29
  • python堆排序算法怎么实现
    堆排序算法的实现步骤如下: 构建最大堆(Max Heap):首先将待排序的序列构建成一个最大堆。从最后一个非叶子节点开始,依次将当...
    99+
    2023-10-26
    python
  • Java常用的八种排序算法是什么
    本篇内容介绍了“Java常用的八种排序算法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.直接插入排序主要解决要把新的数据插入到已经...
    99+
    2023-06-02
  • Java常用的八种排序算法及代码实现+图解
    目录1.冒泡排序冒泡排序法的思路2.冒泡排序法的代码实现3.冒泡排序法优化4.选择排序5.插入排序插入排序的思路经典的排序算法有八种,分别为: 冒泡排序选择排序插入排序归并排序希尔排...
    99+
    2024-04-02
  • C语言怎么实现12种排序算法
    这篇文章主要介绍了C语言怎么实现12种排序算法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言怎么实现12种排序算法文章都会有所收获,下面我们一起来看看吧。1.冒泡排序思路:比较相邻的两个数字,如果前一个数...
    99+
    2023-06-30
  • 怎么在Python中利用排序算法实现插入排序
    怎么在Python中利用排序算法实现插入排序,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、插入排序插入排序与我们平时打扑克牌非常相似,将新摸到的牌插入到已有的牌中合适的位置...
    99+
    2023-06-15
  • Python冒泡排序算法怎么实现
    今天小编给大家分享一下Python冒泡排序算法怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 算法描述冒泡排序(...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作