【算法】汉诺塔、顺序查找和二分查找法、冒泡排序、插入排序、选择排序
1 时间装饰器
2 汉诺塔
3 顺序查找和二分查找法
4 冒泡排序
5 插入排序
6 选择排序
1 时间装饰器
import timedef cal_time(func):def wrapper(*args, **kwargs):t1 = time.time()result = func(*args, **kwargs)t2 = time.time()print("%s running time: %s secs." % (func.__name__, t2 - t1))return resultreturn wrapper
2 汉诺塔
"""
汉诺塔(Tower of Hanoi)是一个经典的数学问题,由法国数学家爱德华·卢卡斯(Édouard Lucas)在1883年提出。
它由三个柱子和若干个直径不同的圆盘组成。起初,所有的圆盘都按直径从大到小堆叠在第一个柱子上。
问题的目标是通过一些步骤将整个圆盘堆移动到另一个柱子上,且在移动过程中需要遵守以下规则:1. 每次只能移动一个圆盘。
2. 每次移动的圆盘必须放在另一个柱子上,并且放置在那个柱子上已经存在的圆盘之上(如果有的话),且必须小于下方的圆盘。这个问题的核心是找到最少的步骤将所有的圆盘移动到目标柱子上。对于n个圆盘,最少的移动次数是 \(2^n - 1\)。### 例子
假设有3个圆盘,初始状态如下:
- 圆盘1(最小)在最上面,圆盘3(最大)在最下面,都在柱子A上。目标是将这3个圆盘按照同样的顺序移动到柱子C上。最少的移动步骤为:
1. 将圆盘1从柱子A移动到柱子C。
2. 将圆盘2从柱子A移动到柱子B。
3. 将圆盘1从柱子C移动到柱子B(放在圆盘2上)。
4. 将圆盘3从柱子A移动到柱子C。
5. 将圆盘1从柱子B移动到柱子A。
6. 将圆盘2从柱子B移动到柱子C(放在圆盘3上)。
7. 将圆盘1从柱子A移动到柱子C(放在圆盘2上)。### 数学表达式
汉诺塔问题的最优解可以用递归算法来表示,其中:
- \( T(n) \) 表示移动n个圆盘所需的最少步数。
- 对于n个圆盘,递归公式为 \( T(n) = 2T(n-1) + 1 \),其中 \( T(1) = 1 \)。汉诺塔问题的时间复杂度是 指数级别的。
具体来说,对于有n个圆盘的汉诺塔问题,最少的移动次数为2的n次方−1。
因此,汉诺塔问题的时间复杂度为O(2的n次方)。"""def hanoi(n, a, b, c):if n > 0:hanoi(n - 1, a, c, b)print("moving from %s to %s" % (a, c))hanoi(n - 1, b, a, c)hanoi(3, 'A', 'B', 'C')
3 顺序查找和二分查找法
from cal_time import *@cal_time
def linear_search(li, val): # 线性排序for ind, v in enumerate(li):if v == val:return indelse:return None@cal_time
def binary_search(li: list, val: int):"""二分查找法(Binary Search)是一种高效的查找算法,适用于在一个已经排序的数组或列表中查找某个特定的元素。二分查找的核心思想是将搜索范围不断折半,从而迅速缩小查找范围。工作原理二分查找通过以下步骤来查找目标值:初始化:设定两个指针,分别指向数组的起始位置和结束位置,通常称为 left 和 right。查找中间元素:计算中间位置 mid,mid 的索引通常通过公式 mid = (left + right) // 2 计算。将目标值与 mid 位置的元素进行比较。缩小范围:如果目标值等于 mid 位置的元素,则查找成功,返回该元素的索引。如果目标值小于 mid 位置的元素,说明目标值在左半部分,于是将 right 更新为 mid - 1。如果目标值大于 mid 位置的元素,说明目标值在右半部分,于是将 left 更新为 mid + 1。重复:重复以上步骤,直到找到目标值或搜索范围为空(即 left > right)。返回结果:如果找到目标值,返回其索引。如果找不到,通常返回 -1 或其他特定值以表示查找失败。时间复杂度二分查找的时间复杂度为O(logn),其中 n 是数组中的元素数量。相比于线性查找O(n),二分查找在处理大规模数据时更加高效。注意事项前提条件:二分查找只适用于已排序的数组或列表。数据类型:二分查找的对象通常是可索引的序列(如数组或列表)。:param li::param val::return:"""left = 0right = len(li) - 1while left <= right: # 候选区有值mid = (left + right) // 2if li[mid] == val:return midelif li[mid] > val: # 带查找的值在mid左侧right = mid - 1else: # li[mid] < val 带查找的值在mid右侧left = mid + 1else:return Noneli = list(range(1000))
# linear_search(li, 389)
binary_search(li, 389)
4 冒泡排序
"""
冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历要排序的列表,
比较相邻的元素并根据需要交换它们的位置,使得每一轮遍历之后,最大的元素“冒泡”到列表的末尾。
这个过程不断重复,直到整个列表有序为止。算法步骤
从列表的第一个元素开始,依次比较相邻的两个元素。
如果前一个元素大于后一个元素,则交换它们的位置。
对每一对相邻元素执行相同的操作,从列表开始到最后的未排序部分为止。
完成一次遍历后,最大的元素就会移动到列表的末尾。
忽略列表中已排序的部分,重复上述步骤,直到没有元素需要交换,列表排序完成。时间复杂度
冒泡排序的最坏情况和平均时间复杂度均为
O(n的2次方),其中n 是列表中元素的数量。
虽然这个算法很简单,但由于其效率较低,在实际应用中,通常仅用于教育目的或非常小的数据集
"""import random
from cal_time import *@cal_time
def bubble_sort(li: list) -> None:for i in range(len(li) - 1): # 第i趟exchange = 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 = Trueif not exchange:returnli = list(range(10000))
random.shuffle(li) # 用于随机打乱(洗牌)一个列表中的元素顺序bubble_sort(li)
5 插入排序
"""
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理类似于人们排序扑克牌:
每次将一个新的元素插入到已经排好序的部分中。这个算法对于小规模数据集或者部分已经排序的数据集非常有效。算法步骤
开始:从第二个元素(索引为1)开始,将其视为待插入的元素。
插入:将该元素与它之前的元素依次比较。如果该元素比前面的元素小,就将前面的元素向后移动一位,直到找到一个合适的位置将该元素插入。
重复:对每一个未排序的元素重复上述步骤,直到整个数组有序。时间复杂度
插入排序的时间复杂度为O(n2),其中 n 是数组中的元素数量。在最佳情况下(数组已经有序),时间复杂度为O(n)。
尽管它的效率不如更复杂的排序算法,但由于其简单性和在某些情况下的有效性,插入排序仍然是一个有用的工具。
"""def insert_sort(li: list):for i in range(1, len(li)): # i表示摸到的牌的下标tmp = li[i]j = i - 1 # j指的就是手里的牌的下标while j >= 0 and li[j] > tmp:li[j + 1] = li[j]j -= 1li[j + 1] = tmpprint(li)li = [3, 2, 4, 1, 5, 7, 9, 6, 8]
# print(li)
insert_sort(li)
6 选择排序
"""
选择排序(Selection Sort)是一种简单的排序算法,
它的基本思想是每一轮从未排序的部分中选择最小(或最大)的元素,并将其放在已排序部分的末尾。
通过不断地选择和交换位置,最终使整个列表有序。算法步骤
从未排序的列表中找到最小(或最大)的元素。
将这个元素与未排序部分的第一个元素交换位置,确保这个最小元素成为已排序部分的一部分。
忽略已经排序的部分,继续从剩下的未排序部分中重复上述步骤,直到整个列表排序完成。选择排序的时间复杂度为O(n2),其中 n 是列表中元素的数量。
这个算法在时间复杂度上和冒泡排序一样,但通常进行的交换次数更少。
因此,虽然它仍然不是最优的排序算法,但在某些特定情况下比冒泡排序更有效。
"""def select_sort_simple(li: list) -> list:li_new = []for i in range(len(li)):min_val = min(li)li_new.append(min_val)li.remove(min_val)return li_newdef select_sort(li: list):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 = jli[i], li[min_loc] = li[min_loc], li[i]print(li)li = [3, 2, 4, 1, 5, 7, 9, 6, 8]
print(li)
select_sort(li)
相关文章:

【算法】汉诺塔、顺序查找和二分查找法、冒泡排序、插入排序、选择排序
1 时间装饰器 2 汉诺塔 3 顺序查找和二分查找法 4 冒泡排序 5 插入排序 6 选择排序 1 时间装饰器 import timedef cal_time(func):def wrapper(*args, **kwargs):t1 time.time()result func(*args, **kwargs)t2 time.time()print("%s running time: %s secs." % …...

Mac电脑遇到DNS解析失败,ip可以访问,域名无法访问
当Mac电脑遇到DNS解析失败的问题时,可以尝试以下几个解决方法: 1.检查网络连接:确保Mac已连接到可用的网络,并且网络连接正常。可以尝试重新连接Wi-Fi或使用有线连接来排除网络问题。 2.清除DNS缓存:打开终端应…...

走进 “星星的孩子” 的世界:理解与关爱儿童自闭症
在这个充满生机与活力的世界里,有一群特殊的孩子,他们仿佛来自遥远的星球,沉浸在自己的独特世界中,难以与外界进行有效的沟通和互动。他们是自闭症儿童,也被称为 “星星的孩子”。 自闭症,又称孤独症谱系障…...

【学习笔记】7、存储器、复杂可编程器件和现场可编程门阵列
可编程逻辑器件PLD复杂可编程逻辑器件CPLD现场可编程门阵列FPGA 7.1 只读存储器(ROM) 7.1.1 ROM的结构 ROM存储器 存储阵列 地址译码器 输出控制电路 存储阵列,由许多存储单元(1bit)组成。每次读出一组数据&…...

Java面试题———RabbitMQ篇
目录 1.你们项目中哪里用到了RabbitMQ 2、为什么会选择使用RabbitMQ 3、使用RabbitMQ如何保证消息不丢失 4、消息的重复消费问题如何解决的 5、如何解决消息堆积在MQ的问题 6、RabbitMQ如何保证消费的顺序性 7、RabbitMQ的延迟队列有了解过嘛 8、RabbitMQ如何设置消息过…...

2 种方式申请免费 SSL 证书,阿里云 Certbot
如何使用免费的 SSL 证书,有时在项目中需要使用免费的 SSL 证书,Aliyun 提供免费证书,三个月有效期,可以直接在aliyun 申请,搜索 SSL 证书,选择测试证书。 Aliyun 证书需要每三月来来换一次,页…...

49.给出一个字符串数组,实现一个算法给定一组字符串,将字母异位词组合在一起
49. Group Anagrams 题目 给定一组字符串,将字母异位词组合在一起。 示例: 输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] 注意: 所有输入均为小写字母。输出的顺序可以…...

如何制作统信UOS启动盘?
如何制作统信UOS启动盘? 一、下载UOS系统安装镜像二、在UOS系统环境下制作启动盘步骤一:准备U盘步骤二:打开启动盘制作工具步骤三:选择ISO镜像文件步骤四:选择安装介质并格式化步骤五:等待制作完成 三、在W…...

Conda命令
查看当前有哪些虚拟环境 conda env list创建(删除)一个新的虚拟环境 conda create --name test1 python3.8 conda env remove --name test1进入和退出一个环境 conda activate test1 conda deactivate列出当前包安装的包 conda list安装包 conda in…...

perl——获取数组中元素的索引
参考: 如何获取数组中元素的索引 如果保证所有元素都是唯一的,或者只有第一个索引是感兴趣的: my ($index) grep { $array[$_] ~~ $element } 0 .. $#array;...

Vector vs 数组:Java中Vector相比数组的优点
每日自动更新各类学习教程及工具下载合集 https://pan.quark.cn/s/874c74e8040e 在Java编程中,数组(Array)和Vector都是用于存储数据的容器,但它们在设计和功能上有所不同。选择使用哪种数据结构取决于具体的需求。在这…...

掌握步进电机控制算法:提升自动化精度的关键(代码示例)
引言 步进电机因其高精度定位、良好的控制性能和简单的驱动方式,广泛应用于各类自动化设备中,如3D打印机、数控机床和机器人等。为了实现对步进电机的精确控制,采用合适的控制算法至关重要。本文将详细介绍几种常见的步进电机控制算法&#…...

MySQL的源码安装及基本部署(基于RHEL7.9)
这里源码安装mysql的5.7.44版本 一、源码安装 1.下载并解压mysql , 进入目录: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz tar xf mysql-boost-5.7.44.tar.gz cd mysql-5.7.44/ 2.准备好mysql编译安装依赖: yum install cmake g…...

RUP-系统架构师(五十六)
1在RUP中采用“41”视图模型来描述软件系统的体系结构。在该模型中,最终用户侧重于(),系统工程师侧重于()。 问题1 问题2 A 实现视图 B 进程视图 C 逻辑视图 D 部署视图 解析: RUP有 逻辑…...

【大模型系列篇】人工智能与智能计算的发展
🔥🔥🔥 来自 中国工程院院士、中国科学院计算技术研究所研究员 孙凝晖 第十四届全国人大常委会专题讲座上的讲稿《人工智能与智能计算的发展》 “把新一代人工智能作为推动科技跨越发展、 产业优化升级、生产力整体跃升的驱动力量,…...

C++ | Leetcode C++题解之第365题水壶问题
题目: 题解: class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };...

c++-类(中)
c-类(中) 一、类的默认成员函数1.1 什么是默认成员函数?1.2 默认成员函数有哪些? 二、构造函数2.1 什么是构造函数?2.2 构造函数的特点 三、析构函数3.1 什么是析构函数?3.2 析构函数的特点 四、拷贝构造函…...

在 Python 中查找列表中的重复元素
在 Python 中查找列表中的重复元素 在数据处理和分析中,查找重复元素是一个常见的任务。无论是在数据清洗、用户输入验证还是统计分析中,识别和处理重复数据都是至关重要的。在 Python 中,有多种方法可以查找列表中的重复元素。本文将详细介绍这些方法,包括示例代码、性能…...

Kafka【一】Windows下安装单节点Kafka
① 下载 下载软件安装包:kafka_2.12-3.6.1.tgz,下载地址:https://kafka.apache.org/downloads 这里的3.6.1,是Kafka软件的版本。截至到2023年12月24日,Kafka最新版本为3.6.1。2.12是对应的Scala开发语言版本。Scala2…...

基于深度学习的分子生成
基于深度学习的分子生成是一项结合化学、计算科学与人工智能的新兴领域,旨在利用深度学习模型来生成具有特定性质的分子结构。该技术在药物发现、材料科学和合成化学等领域具有广泛的应用前景。以下是详细的介绍: 1. 背景与动机 化学空间的广阔性&#…...

python——并行设计
在 Python 中,通过并行设计可以提高程序的效率,特别是在需要处理大量数据或进行耗时操作时。并行设计的基本思想是通过分配任务给多个线程或进程,利用多核 CPU 的计算能力,来同时执行多个任务,从而缩短总的执行时间。 …...

系统架构设计师——软件架构基本概念
基本概念 **软件架构是软件开发中的一个核心概念,它主要关注软件构件的结构、属性和交互作用。**以下是对软件架构的详细解读: 结构:软件架构定义了软件系统的基本结构,包括各个组件、模块和类的关系。这些元素如何组织和相互连…...

证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别
目录 一、背景二、文件格式的区分2.1 .keystore / .jks 文件2.2 .p12 / .pfx 文件2.3 .crt 文件2.4 csr 文件2.5 .pem 文件 三、总结 一、背景 我们在日常的开发过程中,经常会见到各种各样的证书相关类型的文件,错综复杂。 其实 keystore、jks、p12、p…...

基于python的在线自主评测系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

Centos安装Jenkins教程详解版(JDK8+Jenkins2.346.1)
本教程基于 JDK8 和 Jenkins2.346.1 JDK安装 下载OpenJDK8文件 wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz解压到指定目录 # 创建目录 mkdir -p /usr/local/software# 解压文件到指定目录&#…...

聚类分析|距离与相似系数|层次聚类|K均值聚类|SPSS及Matlab
聚类分析问题描述 聚类分析问题描述 人类认识世界的方法之一就是将事物按照各种属性或特征分成若干类别。 物以类聚、人以群分。分类方法多种多样,简单直接的如高、矮、胖瘦。使用的信息量小,但对类别界限附近的案例,分类结果不一定合适。 …...

Linux中安装java和tomcat(保姆级教程)
java 篇 JDK是用于开发Java应用程序的软件开发工具包。它包含了编译器、调试器、运行时环境和其他一些开发工具,可以帮助开发人员创建、编译、调试和部署Java应用程序。JDK提供了Java编程语言的开发工具和运行时库,使开发人员能够编写和执行Java代码。 …...

Vue组件库Element和Vue路由
目录 一、Vue组件库Element(学会怎么CV) 快速入门 ElementUI的常用组件 1.Table表格 (1)组件演示 (2)组件属性详解 2.Pagination分页 (1)组件演示 (2࿰…...

网络编程,网络协议,UDP编程
网络: 1.协议:通信双方约定的一套标准 2.国际网络通信协议标准: 1.OSI协议: 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …...

通过访存地址获取主存数据的过程
目录 1.根据访存地址在Cache中查找数据 2.如果在Cache中命中 3.如果没有命中 4.数据送CPU 5.做几道题: 主要厘清思路,中间细节需自行补充! 1.根据访存地址在Cache中查找数据 ① 访存地址的结构会根据Cache和主存之间的映射方式不同而改变。映射方式…...