【算法】汉诺塔、顺序查找和二分查找法、冒泡排序、插入排序、选择排序
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. 背景与动机 化学空间的广阔性&#…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
