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

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

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

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

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

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

实验内容:

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

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

下面就开始讲解。

冒泡排序:

概念:

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个过程持续到列表已经排序完成。冒泡排序的时间复杂度为O(n^2)。冒泡排序的基本思想是:

  1. 从第一个元素开始,依次比较相邻的两个元素,如果顺序不对就交换它们。
  2. 继续比较相邻的元素,直到最大(或最小)的元素被交换到数列的最后一个位置。
  3. 重复上述步骤,直到整个数列都变得有序。

如图:

在这里插入图片描述

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

代码及详细注释:

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

import random
import time
def bubble_sort(li):for i in range(len(li) - 1):  # 第i趟exchange = False  # 设置交换标志位为Falsefor 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  # 将交换标志位置为Trueif not exchange:  # 如果一趟排序中没有发生交换return li  # 直接返回列表,排序完成li = [random.randint(1, 100000000) for i in range(10000)]
print(li)
start = time.time()
bubble_sort(li)
end = time.time()
print(li)
print('运行时间:%s Seconds' % (end - start))

random和time库

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

运行结果如下(数组太大就只放计时的结果):

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

插入排序:

概念:

插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序的时间复杂度为O(n^2)。插入排序的基本思想是:

  1. 从第二个元素开始,将其与前面的元素进行比较,找到合适的位置插入。
  2. 继续对后面的元素进行插入操作,直到整个数列都变得有序。

如图:

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

代码及详细注释:

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)]
print(li)
start = time.time()
sort(li)
end = time.time()
print(li)
print('运行时间:%s Seconds'%(end-start))

运行结果:

在这里插入图片描述

选择排序:

概念:

选择排序是一种简单直观的排序算法,它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中继续寻找最小(或最大)的元素,放到已排序序列的末尾。选择排序的时间复杂度为O(n^2)。选择排序的基本思想是:

  1. 首先,在待排序的数据中找到最小(或最大)的元素,将其与第一个位置的元素交换。
  2. 然后,在剩下的数据中找到最小(或最大)的元素,将其与第二个位置的元素交换。
  3. 重复上述步骤,直到整个数列都变得有序。

如图:

在这里插入图片描述

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

代码及详细注释:

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)]
print(li)
start = time.time()
select_sort(li)
end = time.time()
print(li)
print('运行时间:%s Seconds'%(end-start))

运行结果:

在这里插入图片描述

总结:

LowB三人组的思路和代码还是好理解和实现的,代码的详细讲解都在注释里,接下来的博客会讲解NB三人组(堆排序,归并排序,快速排序)(数据结构课设篇2,python版)(排序综合),第三篇博客会讲解其他排序(基数排序,希尔排序和桶排序)(数据结构课设篇3,python版)(排序综合) 。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型学习

大模型的参数量和显存占用估算 现在业界的大语言模型都是基于transformer模型的&#xff0c;模型结构主要有两大类&#xff1a;encoder-decoder&#xff08;代表模型是T5&#xff09;和decoder-only&#xff0c;具体的&#xff0c;decoder-only结构又可以分为Causal LM&#x…

C++qt-信号-信号槽

1、概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号和槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决的条件&#xff1a; 通信的对象必须都是从QObject类中派生出来…

开关电源损耗测量之高压空载测试方法 -纳米软件

开关电源在实际使用过程中会产生损耗&#xff0c;损耗过大会直接影响到开关电源的转换效率和性能&#xff0c;从而导致设备无法正常运行。因此测试开关电源的损耗情况也是非常重要的步骤。 高压空载运行测试用来检测开关电源的损耗情况&#xff0c;在空载情况下&#xff0c;带软…

强化学习的数学原理学习笔记 - 策略梯度(Policy Gradient)

文章目录 概览&#xff1a;RL方法分类策略梯度&#xff08;Policy Gradient&#xff09;Basic Policy Gradient目标函数1&#xff1a;平均状态值目标函数2&#xff1a;平均单步奖励&#x1f7e1;PG梯度计算 &#x1f7e6;REINFORCE 本系列文章介绍强化学习基础知识与经典算法原…

正则表达式Regex

是什么&#xff1a;一句话&#xff0c;正则表达式是对字符串执行模式匹配的技术。 从一段字符串中提取出所有英文单词、数字、字母和数字。 如果采用传统方法&#xff1a;将字符串的所有字符分割成单个&#xff0c;根据ASCII码判断&#xff0c;在一定范围内就是字母&#xff…

Fiddler工具 — 10.Statistics(统计)面板

1、Statistics介绍 Statistics 页签显示当前用户选择的 Sessions 的汇总信息&#xff0c;包括&#xff1a;选择的 Sessions 总数、发送字节数、接收字节数、响应类型的汇总表、世界各地通过不同请求方式所需的时间等。 Statistics 分页还会统计请求和响应的其他一些信息,如&a…

QT qss文件设置样式

方式一 &#xff08;单个&#xff09; 方式二 &#xff08;全局&#xff09; 所有按钮都会采用这个样式。 方式三 &#xff08;qss文件&#xff09; 创建资源文件 创建qss文件&#xff08;Button.qss&#xff09; 引用qss文件 QApplication a(argc, argv);QString qss;QFile…

【漏洞复现】锐捷RG-UAC统一上网行为管理系统信息泄露漏洞

Nx01 产品简介 锐捷网络成立于2000年1月&#xff0c;原名实达网络&#xff0c;2003年更名&#xff0c;自成立以来&#xff0c;一直扎根行业&#xff0c;深入场景进行解决方案设计和创新&#xff0c;并利用云计算、SDN、移动互联、大数据、物联网、AI等新技术为各行业用户提供场…

Selenium自动化程序被检测为爬虫,怎么屏蔽和绕过

Selenium 操作被屏蔽 使用selenium自动化网页时&#xff0c;有一定的概率会被目标网站识别&#xff0c;一旦被检测到&#xff0c;目标网站会拦截该客户端做出的网页操作。 比如淘宝和大众点评的登录页&#xff0c;当手工打开浏览器&#xff0c;输入用户名和密码时&#xff0c…

Java后端开发——SSM整合实验

文章目录 Java后端开发——SSM整合实验一、常用方式整合SSM框架二、纯注解方式整合SSM框架 Java后端开发——SSM整合实验 一、常用方式整合SSM框架 1.搭建数据库环境&#xff1a;MySQL数据库中创建一个名称为ssm的数据库&#xff0c;在该数据库中创建一个名称为tb_book的表 …

2024年美国大学生数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

【算法系列 | 12】深入解析查找算法之—斐波那契查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第12讲&#xff0c;讲…