三大排序:冒泡、选择、插入

简介: 三大排序:冒泡、选择、插入

冒泡排序:

冒泡排序(Bubble Sort)是一种简单的排序算法。它通过比较相邻元素的大小,并交换它们的位置,使较大(或较小)的元素逐渐“浮”到数组的一端,从而实现排序的目的。


下面是冒泡排序的基本步骤:


1.首先,从数组的第一个元素开始,依次比较相邻的两个元素。将较大(或较小)的元素交换到右侧,这样一次遍历之后,最大(或最小)的元素就会“浮”到数组的末尾。


2.接下来,继续进行第一步的操作,但这次只需要遍历数组的前 n-1 个元素,其中 n 是数组的长度。这样一次遍历之后,第二大(或第二小)的元素会“浮”到数组的倒数第二个位置。


3.重复上述步骤,每次遍历的元素个数减少一,直到只剩下一个元素为止。


4.最后,经过多次遍历之后,数组中的元素就会按照从小到大(或从大到小)的顺序排列。


下面是一个示例,演示冒泡排序的过程:


假设我们有以下数组:[5, 3, 8, 2, 1]


第一次遍历:


  • 比较 5 和 3:交换位置,数组变为 [3, 5, 8, 2, 1]
  • 比较 5 和 8:位置不变
  • 比较 8 和 2:交换位置,数组变为 [3, 5, 2, 8, 1]
  • 比较 8 和 1:交换位置,数组变为 [3, 5, 2, 1, 8]

第二次遍历:


  • 比较 3 和 5:位置不变
  • 比较 5 和 2:交换位置,数组变为 [3, 2, 5, 1, 8]
  • 比较 5 和 1:交换位置,数组变为 [3, 2, 1, 5, 8]

第三次遍历:


  • 比较 3 和 2:交换位置,数组变为 [2, 3, 1, 5, 8]
  • 比较 3 和 1:交换位置,数组变为 [2, 1, 3, 5, 8]

第四次遍历:


  • 比较 2 和 1:交换位置,数组变为 [1, 2, 3, 5, 8]

经过四次遍历之后,数组就变为有序的:[1, 2, 3, 5, 8]。


冒泡排序的时间复杂度为 O(n^2),其中 n 是数组的长度。尽管冒泡排序在大规模数据集上的效率相对较低,但它是一种简单且容易理解的排序算法。


代码实现:


def Bubble_sort(li):
    for i in range(len(li) - 1):
        for j in range(0, len(li) - i - 1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
    return li

该算法的时间复杂度为O(n^2),同时为了减小计算时间有优化后的冒泡排序:


def Bubble_sort(li):
    exchange=True
    for i in range(len(li) - 1):
            for j in range(0, len(li) - i - 1):
                if li[j] > li[j+1]:
                    li[j], li[j+1] = li[j+1], li[j]
                    exchange=True
            if not exchange:
                return True

插入排序::

插入排序(Insertion Sort)是一种简单直观的排序算法,它的原理是逐步构建有序序列。插入排序的过程类似于打扑克牌时整理手中的牌。


下面是插入排序的基本步骤:


1.假设我们有一个无序的数组,将该数组分为两个部分:已排序部分和未排序部分。初始时,已排序部分只包含数组的第一个元素,而未排序部分包含剩余的元素。


2.从未排序部分取出第一个元素,将其与已排序部分的元素逐个比较。将该元素插入到已排序部分的正确位置,使得插入后的已排序部分仍然保持有序。


3.重复上述步骤,直到未排序部分的所有元素都被插入到已排序部分中。


下面是一个示例,演示插入排序的过程:


假设我们有以下数组:[5, 3, 8, 2, 1]


第一次遍历:


  • 取出未排序部分的第一个元素 3,将其与已排序部分的元素 5 比较。由于 3 小于 5,将 3 插入到 5 之前,已排序部分变为 [3, 5]。
  • 数组变为 [3, 5, 8, 2, 1]

第二次遍历:


  • 取出未排序部分的第一个元素 8,将其与已排序部分的元素逐个比较。由于 8 大于 5,不需要进行插入操作。
  • 数组保持不变:[3, 5, 8, 2, 1]

第三次遍历:


  • 取出未排序部分的第一个元素 2,将其与已排序部分的元素逐个比较。由于 2 小于 8,需要将 2 插入到 8 之前,已排序部分变为 [3, 5, 2, 8]。
  • 数组变为 [3, 5, 2, 8, 1]

第四次遍历:


  • 取出未排序部分的第一个元素 1,将其与已排序部分的元素逐个比较。由于 1 小于 8,需要将 1 插入到 8 之前,已排序部分变为 [3, 5, 2, 1, 8]。
  • 数组变为 [3, 5, 2, 1, 8]

经过四次遍历之后,数组就变为有序的:[1, 2, 3, 5, 8]。


插入排序的时间复杂度为 O(n^2),其中 n 是数组的长度。尽管插入排序的性能在大规模数据集上比其他高级排序算法略逊一筹,但在小型或部分有序的数组上,插入排序的效率较高,并且它的实现较为简单


代码:


def Insert_sort(li):
        for i in range(1,len(li)):
            j=i-1
            tmp=li[i]
            while li[j]>tmp and j>=0:
                  li[j+1]=li[j]
                  j-=1    
            li[j+1]=tmp             
         return li

选择排序:

选择排序(Selection Sort)是一种简单直观的排序算法。它的原理是在未排序部分中选择最小(或最大)的元素,并将其放置在已排序部分的末尾。选择排序的过程类似于在一组元素中不断选择最值的操作。


下面是选择排序的基本步骤:


1.假设我们有一个无序的数组,将该数组分为两个部分:已排序部分和未排序部分。初始时,已排序部分为空,而未排序部分包含所有的元素。


2.在未排序部分中找到最小(或最大)的元素,将其与未排序部分的第一个元素交换位置。这样,最小(或最大)的元素就被放置在已排序部分的末尾。


3.重复上述步骤,每次从未排序部分选择一个最小(或最大)的元素,并将其放置在已排序部分的末尾。


4.当未排序部分为空时,排序完成。


下面是一个示例,演示选择排序的过程:


假设我们有以下数组:[5, 3, 8, 2, 1]


第一次遍历:


  • 在未排序部分中找到最小的元素 1,将其与未排序部分的第一个元素 5 交换位置。已排序部分变为 [1],未排序部分变为 [5, 3, 8, 2]。
  • 数组变为 [1, 3, 8, 2, 5]

第二次遍历:


  • 在未排序部分中找到最小的元素 2,将其与未排序部分的第一个元素 3 交换位置。已排序部分变为 [1, 2],未排序部分变为 [3, 8, 5]。
  • 数组变为 [1, 2, 8, 3, 5]

第三次遍历:


  • 在未排序部分中找到最小的元素 3,将其与未排序部分的第一个元素 8 交换位置。已排序部分变为 [1, 2, 3],未排序部分变为 [8, 5]。
  • 数组变为 [1, 2, 3, 8, 5]

第四次遍历:


  • 在未排序部分中找到最小的元素 5,将其与未排序部分的第一个元素 8 交换位置。已排序部分变为 [1, 2, 3, 5],未排序部分变为 [8]。
  • 数组变为 [1, 2, 3, 5, 8]

经过四次遍历之后,数组就变为有序的:[1, 2, 3, 5, 8]。


选择排序的时间复杂度为 O(n^2),其中 n 是数组的长度。尽管选择排序的性能在大规模数据集上不如其他高级排序算法,但它是一种简单且容易实现的排序算法。


代码:


def select_sort(li):
    for i in range(len(li)-1);
            min=i
            for j in range(i+1,len(li));
                if li[j]<li[min]:
                    min=j
            li[i],li[min]=;i[min],li[i]


相关文章
|
9月前
|
人工智能 数据可视化 Serverless
国产之光:Dify何以成为国内Workflow Agent开发者的首选工具
随着 LLM 技术发展,将LLM从概念验证推向生产时面临诸多挑战,如复杂Prompt工程、长上下文管理、缺乏生产级运维工具及快速迭代难等。Dify旨在通过融合后端即服务(BaaS)和LLMOps理念,为开发者提供一站式、可视化、生产就绪的解决方案。
2120 4
|
7月前
|
安全 前端开发 数据可视化
如何选择适合你的建站系统
这是一篇关于如何选择建站系统的指南。文章从明确需求、评估技术预算入手,介绍了易用性、灵活性等核心对比维度,并简要分析了全托管平台、自助建站系统及手工编码等主流方式的适用场景。
223 1
|
数据采集 机器学习/深度学习 人工智能
《AI 剧本生成与动画创作解决方案评测报告》
《AI 剧本生成与动画创作解决方案评测报告》
618 8
《AI 剧本生成与动画创作解决方案评测报告》
|
Linux 虚拟化 数据安全/隐私保护
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
备份的重要性在于它能在系统出现异常或错误时,帮助我们快速恢复到正常状态,避免重新安装系统和配置环境。VMware 提供了两种备份方式:快照和克隆。 **快照**是保存虚拟机某一时刻的完整状态(包括内存、CPU、磁盘数据),便于快速回滚,适合临时保存状态。操作简单,可在系统运行时创建。 **克隆**则是复制整个虚拟机系统,侧重长期备份,需在系统关闭时进行。分为完整克隆和链接克隆,前者独立于源系统,占用更多空间,但更安全可靠。
系统崩溃不用慌!VMware这个逆天功能竟能让CentOS一键回档?后悔药真实存在!
|
人工智能 自然语言处理 监控
软件开发效率低,如何通过AI技术实现软件开发的全面智能化?—— 解析大模型和RAG技术的关键作用
三桥君指出大模型与RAG技术正推动软件工程智能化变革,覆盖需求分析、代码生成、测试和CI/CD全流程。AI可自动解析需求、生成代码、检测缺陷并优化部署,显著提升效率与质量。RAG技术通过检索增强生成,使AI具备知识库实时调用能力。二者的结合让开发者向架构师角色转型,降低人力成本。本文AI专家三桥君从技术融合、场景应用及行业影响展开分析,指出智能化将重塑软件开发范式,开启软件工程新黄金时代。
940 0
|
人工智能 数据可视化 JavaScript
NodeTool:AI 工作流可视化构建器,通过拖放节点设计复杂的工作流,集成 OpenAI 等多个平台
NodeTool 是一个开源的 AI 工作流可视化构建器,通过拖放节点的方式设计复杂的工作流,无需编码即可快速原型设计和测试。它支持本地 GPU 运行 AI 模型,并与 Hugging Face、OpenAI 等平台集成,提供模型访问能力。
1365 14
NodeTool:AI 工作流可视化构建器,通过拖放节点设计复杂的工作流,集成 OpenAI 等多个平台
|
Oracle 关系型数据库
PLSQL_数据泵导入进度查看Impdp/Expdp Status(案例)
20150701 Created By BaoXinjian 一、摘要 查看EXPDP/IMPDP的进度,当你当如导出的时候,如果数据量比较大,中途有些人会着急,不免想看看进度如何 1. 两个视图 DBA_DATAPUMP_JOBS; DBA_DATAPUMP_SESSIONS; 2.
3742 0
|
编解码
西门子S7-200 SMART中断及中断指令概述
上篇文章我们学习了西门子S7-200 SMART如何使用存储卡复位CPU到出厂设置、固件升级和程序传输,本篇我们来介绍西门子S7-200 SMART的中断及中断指令。中断就是中止当前正在运行的程序,去执行为立刻响应的信号而编写的中断服务程序,执行完毕后再返回原来中止的程序并继续执行。西门子S7-200 SMART CPU最多支持38个中断事件,其中8个为预留。为了便于识别,系统给每一个中断事件都分配了一个编号,又称中断事件号。
西门子S7-200 SMART中断及中断指令概述
|
Linux API 项目管理
Linux reset子系统及驱动实例
Linux reset子系统及驱动实例

热门文章

最新文章