LowB三人组(冒泡排序,插入排序,选择排序)(数据结构课设篇1,python版)(排序综合)

本章博客主要详细讲解一下LowB三人组排序,为什么叫LowB三人组呢?因为他们的时间复杂度都为O(n^2)。下篇博客会再讲解NB三人组(堆排序,归并排序和快速排序),第三篇博客会讲解其他排序(基数排序,希尔排序和桶排序)

ps: randomtime库的用法在冒泡排序里讲解。

这也是数据结构的课设之一,总计三篇博客(大部分的排序都进行了讲解),实验内容如下:

概念:

"LowB三人组"指的是冒泡排序、插入排序和选择排序,它们被称为"LowB"是因为它们的时间复杂度较高,性能较差,不适合处理大规模数据。它们的时间复杂度都是O(n^2),在大规模数据下性能表现较差。

NB三人组排序是堆排序、归并排序和快速排序,这是因为这些排序算法在实现上比较复杂,但在大规模数据上有较好的性能。堆排序、归并排序和快速排序都适用于大规模数据,它们具有较好的平均时间复杂度和空间复杂度,时间复杂度都为O(n log n)。

实验内容

利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。
要求:

  1. 至少采用四种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。
  2. 统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比,),找出其中两种较快的方法。

下面就开始讲解。

冒泡排序:

先看下冒泡排序的过程:
在这里插入图片描述

如图所示为每一趟冒泡排序后的状态,每一趟冒泡排序选从第一个数开始遍历,比较两数大小,把大的数和小的数交换位置,每一趟冒泡排序都能选出一个最大值放在最后。

代码及详细注释

这里设置了个监视哨,作用是如果数组有序,则只需遍历一遍数组就会结束,大大减少了运行时间。

import random
import time
def bubble_sort(li):
    for i in range(len(li) - 1):  # 第i趟
        exchange = False  # 设置交换标志位为False
        for j in range(len(li) - i - 1):
            if li[j] > li[j + 1]:  # 如果前一个元素大于后一个元素
                li[j], li[j + 1] = li[j + 1], li[j]  # 交换两个元素的位置
                exchange = True  # 将交换标志位置为True
        if not exchange:  # 如果一趟排序中没有发生交换
            return li  # 直接返回列表,排序完成

li = [random.randint(1, 100000000) for i in range(10000)] # 生成10000个从1到1亿的随机数
start = time.time()  # 开始计时
print(li)
bubble_sort(li)
print(li)
end = time.time()  # 结束计时
print('运行时间:%s Seconds' % (end - start))

这里引用了random和time库,一个用来生成随机数,randint()用法是生成整数,time用来计时程序运行时间,类型为浮点型,精度较高。

运行结果如下(数组太大就只放计时的结果):
在这里插入图片描述
这里运行结果每次都会有变化,主要看生成随机数的排序情况。但冒泡排序执行时间都会在几秒内(较慢)

插入排序:

一样,先看一下插入排序的过程:
在这里插入图片描述
插入排序其实跟你打牌时摸牌一样,打斗地主摸牌时摸到一张新牌就给它插入到已排好序的牌里。插入排序就是这个过程,刚开始时选择第一个数排序,然后再选下一个新数插入排序如此往复,直到所有数组有序。

代码及详细注释:

import random
import time
def sort(li):
    for i in range(1, len(li)):  # 从第二张牌开始摸牌
        tmp = li[i]  # 摸到的牌
        j = i - 1  # 手里的牌的最后一张的下标
        while j >= 0 and li[j] > tmp:  # 如果手里的牌比摸到的牌大
            li[j + 1] = li[j]  # 将手里的牌往后移动一位
            j -= 1  # 继续和前一张手里的牌比较
        li[j + 1] = tmp  # 将摸到的牌插入到正确的位置

li = [random.randint(1, 100000000) for i in range(10000)]
start = time.time()
print(li)
sort(li)
print(li)
end = time.time()
print('运行时间:%s Seconds'%(end-start))

运行结果:
在这里插入图片描述

选择排序:

选择排序的过程:
在这里插入图片描述
从图中就可以看出来什么是选择排序,选择排序就是每趟选取最小的元素与它最终应该在的位置上的元素交换位置,直到数组有序。

代码及详细注释:

import random
import time
def select_sort(li):
    for i in range(len(li)-1):  # 第i趟排序
        min_loc = i  # 假设当前位置为最小值的位置
        for j in range(i+1, len(li)):  # 从当前位置的下一个位置开始遍历
            if li[j] < li[min_loc]:  # 如果找到比当前位置更小的值
                min_loc = j  # 更新最小值的位置
        li[i], li[min_loc] = li[min_loc], li[i]  # 将最小值和当前位置交换位置
li = [random.randint(1, 100000000) for i in range(10000)]
start = time.time()
print(li)
select_sort(li)
print(li)
end = time.time()
print('运行时间:%s Seconds'%(end-start))

运行结果:
在这里插入图片描述

总结:

LowB三人组还是比较简单和好理解的,接下来的博客会讲解NB三人组(堆排序,归并排序和快速排序),第三篇博客会讲解其他排序(基数排序,希尔排序和桶排序) 。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言全面学习基础阶段01—C生万物

如何学好 C 语言 1. 鼓励你&#xff0c;为你叫好。 C 生万物 编程之本 长远 IT 职业发展的首选 C 语言是母体语言&#xff0c;是人机交互接近底层的桥梁 学会 C/C &#xff0c;相当于掌握技术核心 知识点一竿子打通。 IT 行业&#xff0c;一般每 10 年就有一次变革 40 年间&a…

【GUI界面软件】抖音评论采集:自动采集10000多条,含二级评论、展开评论!

文章目录 一、背景说明1.1 效果演示1.2 演示视频1.3 软件说明 二、代码讲解2.1 爬虫采集模块2.2 软件界面模块2.3 日志模块 三、获取源码及软件 一、背景说明 1.1 效果演示 您好&#xff01;我是马哥python说&#xff0c;一名10年程序猿。 我用python开发了一个爬虫采集软件…

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

&#xff08;一&#xff09;strlen函数的使用 strlen函数的演示 #include <stdio.h> #include <string.h>int main() {char arr1[] "abcdef";char arr2[] "good";printf("arr1 %d,arr2 %d",strlen(arr1),strlen(arr2));return …

windows下使用Apache配置WebDav

1.Apache下载 我使用的Apache版本是2.4.58 大家可以在Apache官网下载自己需要的版本 Download - The Apache HTTP Server Project 2.Apache配置 解压Apache放到你想放置的目录&#xff0c;我是放在C盘&#xff0c;C:\Apache24 如图&#xff1a; 修改配置文件httpd.conf 此…

test dbtest-02-Liquibase 是一个数据库变更管理工具

拓展阅读 DbUnit-01-数据库测试工具入门介绍 database tool-01-flyway 数据库迁移工具介绍 什么是 Liquibase&#xff1f; Liquibase 是一种开源的数据库架构变更管理解决方案&#xff0c;它使你能够轻松地管理数据库变更的修订版本。 Liquibase使得参与应用程序发布流程的…

项目中对日期进行格式化的方法

方式一&#xff1a;在属性上添加注解进行格式化 需要引入jackson包 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</version> </dependency>在属性上…

FreeRTOS移植

目录 一、FreeRTOS简介1.1 初识FreeRTOS1.2 FreeRTOS资料获取1.3 开发环境简介 二、FreeRTOS移植2.1 文件添加2.2 keil工程添加2.3 文件修改 一、FreeRTOS简介 1.1 初识FreeRTOS 首先看一下 FreeRTOS 的名字&#xff0c;可以分为两部分&#xff1a;“Free”和“RTOS”&#xf…

5分钟搞懂AI的可解释性

大家好啊&#xff0c;我是董董灿。 想象一下&#xff0c;如果有一天&#xff0c;有人跑过来突然告诉你&#xff0c;他搞懂了人类大脑记忆的运行机制&#xff0c;你会是什么反应&#xff1f; 你可能会和我一样&#xff0c;把他当做疯子。 因为我觉得这个课题太深奥了&#xf…

2023高级人工智能期末总结

1、人工智能概念的一般描述 人工智能是那些与人的思维相关的活动&#xff0c;诸如决策、问题求解和学习等的自动化&#xff1b; 人工智能是一种计算机能够思维&#xff0c;使机器具有智力的激动人心的新尝试&#xff1b; 人工智能是研究如何让计算机做现阶段只有人才能做得好的…

Jmeter 性能 —— 电商系统TPS计算

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据&#xff0c;看一下生产进件有多少&#xff0c;计算得来的&#xff0c;如果没有生产数据&#xff0c;或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据&#xff0c;比如每天调用了多少个接口&#…

应用系统如何集成和扩展开源工作流引擎

目前主流的开源流程引擎有activiti、flowable、camunda等&#xff0c;这几个开源流程引擎的版本很多&#xff0c;哪个开源流程引擎哪个版本的功能更多、性能更好&#xff0c;该如何选择请参考&#xff1a;https://lowcode.blog.csdn.net/article/details/116405594 无论您选择…

微信小程序使用mqtt开发可以,真机不行

以下可以解决我的问题&#xff0c;请一步一步跟着做&#xff0c;有可能版本不一样就失败了 一、下载mqtt.js 前往蓝奏云 https://wwue.lanzouo.com/iQPdc1k50hpe 下载好后将.txt改为.js 然后放入项目里 二、连接mqtt const mqtt require(../../utils/mqtt.min); let cli…

VUE部署到IIS中报404错误解决方案-配置URL重写

VUE部署到IIS中报404错误解决方案-配置URL重写 第一步&#xff0c;Windows服务器中开启IIS 可承载的web核心 1、添加角色和功能中安装iis 可承载web核心 第二步&#xff0c;下载url重写工具 官方网站下载地址&#xff1a; https://www.iis.net/downloads/microsoft/url-rewrit…

【JVM】类加载器ClassLoader

一、简介 在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是一个关键的组件&#xff0c;它负责将字节码文件加载到内存并转换成Java类。Java的类加载器主要可以分成两类&#xff1a;系统提供的和由Java应用开发人员编写的。Java开发者可以根据需要创建自己的…

54、Softmax 分类器以及它的底层原理

下面开始介绍最后一个算法softmax。在前面介绍全连接算法或其他文章中,或多或少也提到了softmax。 在分类网络里,softmax的作用主要是将模型的原始输出映射到 0~1之间的概率分布。很多时候对于我们初学者而言,只知道softmax可以做概率映射,但并不了解它内部的原理是如何完…

【Linux Shell】8. test 命令

文章目录 【 1. 数值测试 】【 2. 字符串测试 】【 3. 文件测试 】 Shell中的 test 命令用于检查某个条件是否成立&#xff0c;它可以进行数值、字符和文件三个方面的测试。 【 1. 数值测试 】 参数作用-eq等于则为真-ne不等于则为真-gt大于则为真-ge大于等于则为真-lt小于则…

2023年广东省网络安全A模块(笔记详解)

模块A 基础设施设置与安全加固 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c;根据任务要求确保各服务正常运行&#xff0c;并通过综合运用登录和密码策略、流量完整性保护策略、事件监控策略、防火墙策略等多…

TF-IDF(Term Frequency-Inverse Document Frequency)算法 简介

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种用于信息检索和文本挖掘的常用算法。它用于评估一个词对于一个文档集合中某个文档的重要性。 这个算法的基本思想是&#xff1a;如果一个词在一个文档中频繁出现&#xff0c;并且在整个文档集合…

poium测试库之JavaScript API封装原理

为什么要封装JavaScript的API&#xff1f; 因为有些场景下Selenium提供的API并不能满足我们需求。比如&#xff0c;滑动浏览滚动条&#xff0c;控制元素的显示/隐藏&#xff0c;日历控件的操作等&#xff0c;都可以通过JavaScrip实现&#xff0c;而且Selenium为我们提供了 exe…

QT上位机开发(网络程序界面开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机对接方式还是以232、485、can为主&#xff0c;随着网络的发展&#xff0c;越来越多的设备都是以网络进行通信的。毕竟相比较之前&…