冒泡排序、选择排序、插入排序、希尔排序

news2024/11/17 11:47:37

冒泡排序

基本思想

 

代码实现

# 冒泡排序
def bubble_sort(arr):
    length = len(arr) - 1
    for i in range(length):
        flag = True
        for j in range(length - i):
            if arr[j] > arr[j + 1]:
                temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
                flag = False

        print(f'第{i + 1}趟的排序结果为:', arr)

        if flag:
            # 代码优化,如果某一趟排序中没有发生交换,表示序列已经有序,可以提前结束循环
            break


bubble_sort([3, 9, -1, 10, 20])
bubble_sort([3, 9, -1, 10, -2])

选择排序

基本思想

 

代码实现

# 选择排序
def select_sort(arr):
    for i in range(len(arr) - 1):  # 进行 n-1 趟排序
        min = arr[i]
        index = i
        for j in range(i + 1, len(arr)):
            if min > arr[j]:
                min = arr[j]
                index = j

        if index != i:
            arr[index] = arr[i]
            arr[i] = min

        print(f'第{i + 1}趟排序结果:', arr)


select_sort([3, 9, -1, 10, -2])
select_sort([3, 9, -1, 10, 20])

插入排序

基本思想

代码实现

# 插入排序
def insert_sort(arr):
    # for 循环遍历的是待排序的序列,即无序的序列
    for i in range(len(arr) - 1):
        insert_val = arr[i + 1]  # 待插入有序列表的值
        # 以 insert_index 位置为分割点,可以把 insert_index 及其之前的元素理解为已排序的序列
        # insert_index 以后的元素是无序序列
        insert_index = i  # 待插入值的前一个值的下标,即有序列表的最后一个元素的位置

        # while 循环遍历的是已有序的序列
        # insert_index >= 0 保证下标不越界
        # 从后往前访问有序列表
        # insert_val < arr[insert_index] 当待插入的值比有序列表中的值还小时,往前遍历有序列表,继续比较
        while insert_index >= 0 and insert_val < arr[insert_index]:
            # 将 arr[insert_index] 值后移,空出前面的位置存放待插入的值
            arr[insert_index + 1] = arr[insert_index]
            # 继续访问有序列表的前一个元素
            insert_index -= 1

        # 退出循环时,表示找到了插入的位置
        # 插入的位置为 insert_index + 1 ,因为 insert_index 位置要么为 -1 ,要么为比待插入值小的数
        arr[insert_index + 1] = insert_val
        print(f'第{i + 1}个待插入的值插入后的结果', arr)


insert_sort([3, 9, -1, 10, -2])
insert_sort([3, 9, -1, 10, 20])

希尔排序

基本思想

 

 

代码实现

# 希尔排序——交换法(效率低)
def shell_sort1(arr):
    """
    # 以 [8, 9, 1, 7, 2, 3, 5, 4, 6, 0] 为例进行分析
    # 希尔排序的第一轮
    # 第一轮将数组分为 10 // 2 = 5 组
    for i in range(5, len(arr)):
        # 遍历各组中所有的元素(共5组,每组2个元素),步长为5
        j = i - 5
        while j >= 0:
            # 如果当前元素大于加上步长后的哪个元素,说明需要交换
            if arr[j] > arr[j + 5]:
                temp = arr[j]
                arr[j] = arr[j + 5]
                arr[j + 5] = temp
            j -= 5

    print('希尔排序的第一轮结果:', arr)

    # 希尔排序的第二轮 [3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
    # 第二轮将数组分为 5 // 2 = 2 组
    for i in range(2, len(arr)):
        # 遍历各组中所有的元素(共2组,每组5个元素),步长为5
        j = i - 2
        while j >= 0:
            # 如果当前元素大于加上步长后的哪个元素,说明需要交换
            if arr[j] > arr[j + 2]:
                temp = arr[j]
                arr[j] = arr[j + 2]
                arr[j + 2] = temp
            j -= 2

    print('希尔排序的第二轮结果:', arr)

    # 希尔排序的第三轮 [0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
    # 第三轮将数组分为 2 // 2 = 1 组
    for i in range(1, len(arr)):
        # 遍历各组中所有的元素(共1组,每组10个元素),步长为5
        j = i - 1
        while j >= 0:
            # 如果当前元素大于加上步长后的哪个元素,说明需要交换
            if arr[j] > arr[j + 1]:
                temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
            j -= 1

    print('希尔排序的第三轮结果:', arr)
    """

    # 交换法希尔排序
    gap = len(arr) // 2
    while gap > 0:
        for i in range(gap, len(arr)):
            # 遍历各组中所有的元素,步长为gap
            j = i - gap
            while j >= 0:
                # 如果当前元素大于加上步长后的哪个元素,说明需要交换
                if arr[j] > arr[j + gap]:
                    temp = arr[j]
                    arr[j] = arr[j + gap]
                    arr[j + gap] = temp
                j -= gap

        print('本轮排序结果:', arr)
        gap //= 2


# 希尔排序——移位法(效率更高)
def shell_sort2(arr):
    # 移位法希尔排序,效率更高
    gap = len(arr) // 2
    while gap > 0:
        for i in range(gap, len(arr)):
            j = i
            temp = arr[j]
            if arr[j] < arr[j - gap]:
                while j - gap >= 0 and temp < arr[j - gap]:
                    arr[j] = arr[j - gap]
                    j -= gap
                arr[j] = temp

        print('本轮排序结果:', arr)
        gap //= 2


shell_sort1([8, 9, 1, 7, 2, 3, 5, 4, 6, 0])
shell_sort2([8, 9, 1, 7, 2, 3, 5, 4, 6, 0])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于51单片机+DS1302时钟模块+4位数码管显示

一、DS1302时钟模块简介 二、绘制Proteus 仿真电路图 三、编写51单片机代码 #include "DS1302.h"// 位定义 sbit DS1302_DATA P3^3; sbit SCLK P3^2; sbit RST P3^1;// 向DS1302写一个字节 void DS1302_Write_Byte(unsigned char addrOrData) {unsigned char i;f…

RocketMQ的架构及概念

RocketMQ就是一个消息中间键用于实现异步传输与解耦 那什么是消息中间键呢&#xff1f; 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型&#xff0c;它可以在分布式环境下扩展…

CSP 201312-1 出现次数最多的数

答题 用两个map&#xff0c;一个map记录每个数出现的次数并降序排序&#xff0c;另一个map将次数作为键&#xff0c;数本身作为值&#xff0c;降序排序&#xff0c;搞定 #include<iostream> #include<map> using namespace std; int main(){map<int,int,great…

arm栈推导

按照栈生长方向分&#xff1a;可以分为递增栈&#xff08;向高地址生长&#xff09;&#xff1b;递减栈&#xff08;向低地址生长&#xff09; 按照sp执行位置来分&#xff1a;满栈&#xff08;sp指向栈顶元素的位置&#xff09;&#xff1b;空栈&#xff08;sp指向即将入栈的…

ChatGPT 和 Elasticsearch:APM 工具、性能和成本分析

作者&#xff1a;LUCA WINTERGERST 在本博客中&#xff0c;我们将测试一个使用 OpenAI 的 Python 应用程序并分析其性能以及运行该应用程序的成本。 使用从应用程序收集的数据&#xff0c;我们还将展示如何将 LLMs 成到你的应用程序中。 在之前的博客文章中&#xff0c;我们构建…

SpringBoot+Vue 整合websocket实现简单聊天窗口

效果图 1 输入临时名字充当账号使用 2 进入聊天窗口 3 发送消息 &#xff08;复制一个页面&#xff0c;输入其他名字&#xff0c;方便展示效果&#xff09; 4 其他窗口效果 代码实现 后端SpringBoot项目&#xff0c;自行创建 pom依赖 <dependency><groupId…

docker安装xxl-job连接数据库时显示无法连接问题

背景&#xff1a; 在项目中需要定时任务调度&#xff0c;需要在docker容器中安装xxl-job 遇到的问题 部署成功后&#xff0c;可以访问xxl-job登录界面&#xff0c;点登录没反应&#xff0c;但过一段时间就弹出数据库拒绝连接&#xff0c;说MyBatis连接用户失败 原因&#xf…

华为云API图像识别Image的趣味性—AI识别迈克尔·杰克逊

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI图像识别的图像识别、名人识别 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&#xff0c;基…

深度学习算法

深度学习算法 1. 各种网络框架及其联系1.1 两阶段与一阶段区别1.1.1 detectron算法框架套路&#xff1a;1.1.2 multi-stage1.1.3 two-stage 算法1.1.4 one-stage 算法 2. 常用算法2.1 SS(选择性搜索算法&#xff0c;Selective Search) 3. 神经元模型4. 神经网络分类4.1 前馈神经…

Linux内核分析与应用5-中断

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 中断机制概述 中断是CPU对系统发生的某个事件作出的一种反应, 当中断发生时,CPU暂停正在执行的程序,保留现场后,自动转去执行相应…

一本快速入门Java的书

关于这本书 很高兴&#xff0c;我又一本书籍《Java编程动手学》上市了。记得早在2017年&#xff0c;在我跟人邮出版社的傅道坤编辑合作完《Tomcat内核设计剖析》这本书后&#xff0c;傅编就问我考不考虑写一本面向Java初学者的图书&#xff0c;当时我谢绝了傅编的邀请。一来是我…

总结986

时间记录&#xff1a; 7:10起床 8:00~下午2:00课程设计&#xff0c;偷学了3小时 2:17~3:55午觉 4:10~5:30计网 5:35~6:41数据结构 7:00~7:22继续数据结构课后习题重做 7:23~8:07考研政治&#xff0c;做题20道纠错 8:15~8:39每日长难句 8:39~10:21 14年tex2纠错标记 1…

Unity下如何实现RTMP或RTSP播放端录像?

好多开发者问我们&#xff0c;Unity环境下&#xff0c;除了RTSP或RTMP的播放&#xff0c;如果有录像诉求&#xff0c;怎么实现&#xff1f;实际上录像相对播放来说&#xff0c;更简单一些&#xff0c;因为不涉及到绘制&#xff0c;只要拉流下来数据&#xff0c;直接写mp4文件就…

pytorch代码实现之SAConv卷积

SAConv卷积 SAConv卷积模块是一种精度更高、速度更快的“即插即用”卷积&#xff0c;目前很多方法被提出用于降低模型冗余、加速模型推理速度&#xff0c;然而这些方法往往关注于消除不重要的滤波器或构建高效计算单元&#xff0c;反而忽略了特征内部的模式冗余。 原文地址&am…

BUUCTF Reverse/[羊城杯 2020]login(python程序)

查看信息,python文件 动调了一下&#xff0c;该程序创建了一个线程来读入数据&#xff0c;而这个线程的代码应该是放在内存中直接执行的&#xff0c;本地看不到代码&#xff0c;很蛋疼 查了下可以用PyInstaller Extractor工具来解包&#xff0c;可以参考这个Python解包及反编译…

华为云云服务器云耀L实例评测 | 在华为云耀L实例上搭建电商店铺管理系统:一次场景体验

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

sqli第一关

1.在下使用火狐访问sqlilabs靶场并使用burpsuite代理火狐。左为sqlilabs第一关&#xff0c;右为burpsuite。 2.输入?id1 and 11 与?id1 and 12试试 可以看出没有变化哈&#xff0c;明显我们输入的语句被过滤了。在?id1后面尝试各种字符&#xff0c;发现单引号 包…

Linux内核分析与应用4-内存管理

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 4.1 Linux内存管理机制 lscpu[2] 命令, 类似是优化后的 cat /proc/cpuinfo 实现虚拟内存的几种机制: 当 程序一旦跑起来,那就变成…

IDEA在创建包时如何把包分开实现自动分层

IDEA在创建包时如何把包分开实现自动分层 文章目录 IDEA在创建包时如何把包分开实现自动分层一、为什么要把包分开二、建包时如何把包自动分开三、如何编写配置文件路径&#xff1f; 一、为什么要把包分开 一开始的时候&#xff0c;我也一直以为包连在一起和分开没什么区别&am…

二叉搜索树/二叉排序树/二叉查找树

文章目录 1.概念2.操作3.实现3.1框架3.2BSTree.h3.3test.cpp 1.概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;…