python算法实现源码_Python实现七个基本算法

1.顺序查找

当数据存储在诸如列表的集合中时,我们说这些数据具有线性或顺序关系。 每个数据元素都存储在相对于其他数据元素的位置。 由于这些索引值是有序的,我们可以按顺序访问它们。 这个过程产实现的搜索即为顺序查找。

顺序查找原理剖析:从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,直到找到我们正在寻找的元素或遍历完整个列表。如果我们遍历完整个列表,则说明正在搜索的元素不存在。

代码实现:该函数需要一个列表和我们正在寻找的元素作为参数,并返回一个是否存在的布尔值。found 布尔变量初始化为 False,如果我们发现列表中的元素,则赋值为 True。

def search(alist,item):

find = False

cur = 0

while cur < len(alist):

if alist[cur] == item:

find = True

break

else:

cur += 1

return find

2.二分查找

有序列表对于我们的实现搜索是很有用的。在顺序查找中,当我们与第一个元素进行比较时,如果第一个元素不是我们要查找的,则最多还有 n-1 个元素需要进行比较。

二分查找则是从中间元素开始,而不是按顺序查找列表。 如果该元素是我们正在寻找的元素,我们就完成了查找。 如果它不是,我们可以使用列表的有序性质来消除剩余元素的一半。

如果我们正在查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。如果该元素在列表中,肯定在大的那半部分。然后我们可以用大的半部分重复该过程,继续从中间元素开始,将其与我们正在寻找的内容进行比较。

#Python学习交流群:778463939

def search(alist,item):

left = 0

right = len(alist) - 1

find = False

while left <= right:

mid_index = (left + right)//2

if item == alist[mid_index]:

find = True

break

else:

if item > alist[mid_index]:

left = mid_index + 1

else:

right = mid_index -1

return find

3.冒泡排序

原理:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

65953.html

def sort(alist):

length = len(alist)

for i in range(0,length-1):

for j in range(0,length-1-i):

if alist[i] > alist[i+1]:

alist[i],alist[i+1] = alist[i+1],alist[i]

4.选择排序

工作原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

65953.html

#Python学习交流群:778463939

def sort(alist):

length = len(alist)

for j in range(length-1,0,-1):

max_index = 0

for i in range(1,j+1):

if alist[max_index] < alist[i]:

max_index = i

alist[max_index],alist[j] = alist[j],alist[max_index]

5.插入排序

原理:

基本思想是,每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。关键码是数据元素中某个数据项的值,用它可以标示一个数据元素。

65953.html

def sort(alist):

length = len(alist)

for j in range(1,length):

i = j

while i > 0:

if alist[i] < alist[i-1]:

alist[i],alist[i-1] = alist[i-1],alist[i]

i -= 1

else:

break

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。

def sort(alist):

gap = len(alist)//2

while gap >= 1:

for j in range(gap,len(alist)):

i = j

while i > 0:

if alist[i] < alist[i-gap]:

alist[i],alist[i-gap] = alist[i-gap],alist[i]

i -= gap

else:

break

gap = gap // 2

6.快速排序

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

65953.html

#Python学习交流群:778463939

def sort(alist,start,end):

low = start

high = end

if low >= high:

return

mid = alist[low]

while low < high:

while low < high:

if alist[high] >= mid:

high -= 1

else:

alist[low] = alist[high]

break

while low < high:

if alist[low] < mid:

low += 1

else:

alist[high] = alist[low]

break

alist[low] = mid

sort(alist,start,low-1)

sort(alist,high+1,end)

7.归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

65953.html

def merge_sort(alist):

n = len(alist)

#结束递归的条件

if n <= 1:

return alist

#中间索引

mid = n//2

left_li = merge_sort(alist[:mid])

right_li = merge_sort(alist[mid:])

#指向左右表中第一个元素的指针

left_pointer,right_pointer = 0,0

#合并数据对应的列表:该表中存储的为排序后的数据

result = []

while left_pointer < len(left_li) and right_pointer < len(right_li):

#比较最小集合中的元素,将最小元素添加到result列表中

if left_li[left_pointer] < right_li[right_pointer]:

result.append(left_li[left_pointer])

left_pointer += 1

else:

result.append(right_li[right_pointer])

right_pointer += 1

#当左右表的某一个表的指针偏移到末尾的时候,比较大小结束,将另一张表中的数据(有序)添加到result中

result += left_li[left_pointer:]

result += right_li[right_pointer:]

return result

alist = [3,8,5,7,6]

print(merge_sort(alist))

8.各个算法的时间复杂度

65953.html

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

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

相关文章

python词云设计实例_python词云库wordcloud的使用方法与实例详解

wordcloud是优秀的词云展示第三方库一、基本使用 import jieba import wordcloud txt open("1.txt", "r", encodingutf-8).read() words jieba.lcut(txt) txt_1 " ".join(words) # print(txt1) w wordcloud.WordCloud(font_path"msyh.t…

细胞因子风暴与新冠肺炎

来源&#xff1a;陈辉科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-3426569-1219679.html 2020年2月15日下午&#xff0c;在国务院联发联控机制新闻发布会上&#xff0c;周琪院士介绍说“炎症因子风暴”[作者注释&#xff1a;即是细胞因子风暴&#xff08;Cy…

mysql 启动 修改密码_基础的启动/停止/重启/密码修改MySQL

如何启动/停止/重启MySQL一、启动方式1、使用 service 启动&#xff1a;service mysqld start2、使用 mysqld脚本启动&#xff1a;/etc/inint.d/mysqld start3、使用 safe_mysqld启动&#xff1a;safe_mysqld&二、停止1、使用 service 启动&#xff1a;service mysqldstop2…

预编译对象解决SQL注入问题

转载于:https://www.cnblogs.com/suanshun/p/6739454.html

eclipse中添加jar包后运行时提示noclassdeffounderror_一看你就懂,超详细 java 中的 ClassLoader 详解,耐心看~...

备注&#xff1a;本文篇幅比较长&#xff0c;但内容简单&#xff0c;大家不要恐慌&#xff0c;安静地耐心翻阅就是Class文件的认识我们都知道在Java中程序是运行在虚拟机中&#xff0c;我们平常用文本编辑器或者是IDE编写的程序都是.java格式的文件&#xff0c;这是最基础的源码…

寻找人机之间的中间地带-评述3本人机协作的书

来源&#xff1a; 混沌巡洋舰1 AI 错觉知其然&#xff0c;更要知其所以然&#xff0c;了解数据挖掘的算法的基础原理&#xff0c;可以在这个人工智能和大数据可能比工业革命更能改变人的一生的历史时期中&#xff0c;更有智慧的应用人工智能。AI错觉这本书18年在美国出版&#…

TypeError: HashUpdate fail

关于crypto的md5加密报错&#xff1a; 代码&#xff1a; var crypto require(crypto); var md5 crypto.createHash(md5); //crypto模块功能是加密并生成各种散列 var oldpass md5.update(oldpass).digest(hex); var newpass md5.update(newpass).digest(hex);如果md5.updat…

mysql 与gemfire的同步_(转)分布式缓存GemFire架构介绍

1什么是GemFireGemFire是一个位于应用集群和后端数据源之间的高性能、分布式的操作数据(operational data)管理基础架构。它提供了低延迟、高吞吐量的数据共享和事件分发。GemFire充分利用网络中的内存和磁盘资源&#xff0c;形成一个实时的数据网格(data fabric or grid)。Gem…

混合云关键技术能力和发展趋势

来源&#xff1a;IDC圈为满足成本、按需、隐私、合规、避免供应商锁定等目的&#xff0c;企业常常会采用多个公有云或私有云&#xff0c;这会造成基础设施资源池多样化&#xff0c;还要面临同时管理物理机、虚拟化等异构资源环境。多云管理由于面临同时管理物理机、虚拟化等异构…

文字竖着写怎么设置_微信置顶文字怎么设置 微信置顶文字的方法介绍|微信|置顶软硬件资讯川北在线...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供…

DOM查找元素的方法总结

按HTML查找&#xff1a;优点&#xff1a;范围可大可小&#xff0c;可设置条件&#xff1b;包括五种方式&#xff1a;1.按id查找&#xff1b;2.按标签名查找&#xff1a;var elems parent.getElementsByTagName();3.按name属性查找&#xff1a;要回传给服务器的元素需要name属性…

2019 NLP大全:论文、博客、教程、工程进展全梳理(长文预警)

来源&#xff1a;机器学习研究会订阅号在整个2019年&#xff0c;NLP领域都沉淀了哪些东西&#xff1f;有没有什么是你错过的&#xff1f;如果觉得自己梳理太费时&#xff0c;不妨看一下本文作者整理的结果。2019 年对自然语言处理&#xff08;NLP&#xff09;来说是令人印象深刻…

collection集合 地址_java集合系列(5)LinkedList

这篇文章开始介绍LinkList。他和ArrayList有一些相似&#xff0c;在上一篇文章讲解 ArrayList时&#xff0c;我们知道ArrayList是以数组实现&#xff0c;它的优势是查询性能高&#xff0c;劣势是按顺序增删性能差。如果在不确定元素数量的情况时&#xff0c;不建议使用ArrayLis…

meanshift算法 java_Meanshift,聚类算法

记得刚读研究生的时候&#xff0c;学习的第一个算法就是meanshift算法&#xff0c;所以一直记忆犹新&#xff0c;今天和大家分享一下Meanshift算法&#xff0c;如有错误&#xff0c;请在线交流。Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏…

python 数据分析 电信_实例 | 教你用Python写一个电信客户流失预测模型

原标题&#xff1a;实例 | 教你用Python写一个电信客户流失预测模型CDA数据分析师 出品 作者&#xff1a;真达、Mika 数据&#xff1a;真达 【导读】 今天教大家如何用Python写一个电信用户流失预测模型。公众号后台&#xff0c;回复关键字“电信”获取完整数据。 之前我们用Py…

人机融合智能与深度态势感知

来源&#xff1a;人机与认知实验室【“常无欲以观其妙&#xff0c;常有欲以观其徼。”&#xff0c;意思是身处物外可以以旁观者的身份来看待事物&#xff0c;身处事内则要考虑各种极限。】0 引言伴随着深度学习[1]、强化学习[2]等新一代人工智能技术的发展&#xff0c;智能化已…

java大数模板_java大数模板

这几天做了几道用大数的题&#xff0c;发现java来做大数运算十分方便。对acmer来说是十分实用的1.valueOf(parament); 将参数转换为制定的类型比如 int a3;BigInteger bBigInteger.valueOf(a);则b3;String s”12345”;BigInteger cBigInteger.valueOf(s);则c12345&#xff1b;2…

20162317 2016-2017-2 《程序设计与数据结构》第8周学习总结

20162317 2016-2017-2 《程序设计与数据结构》第8周学习总结 教材学习内容总结 1.异常的定义&#xff08;中断正常指令的事件&#xff09; 2.异常的特点&#xff08;异常是对象&#xff09; 3.异常的分类&#xff08;CheckedExcception 和 UncheckedException&#xff09; 4.异…

sql return的用法_【实用技能】Seacms 8.7版本SQL注入分析

有些小伙伴刚刚接触SQL编程&#xff0c;对SQL注入表示不太了解。其实在Web攻防中&#xff0c;SQL注入就是一个技能繁杂项&#xff0c;为了帮助大家能更好的理解和掌握&#xff0c;今天小编将要跟大家分享一下关于Seacms 8.7版本SQL注入分析的内容&#xff0c;一定要认真学习哦。…

国科大UCAS胡包钢教授《信息论与机器学习》课程第二讲:信息论基础一

来源&#xff1a;专知信息论中最为基本的概念就是香农熵&#xff08;第8页&#xff09;&#xff0c;由此可以导出信息论中其它各种定义&#xff0c;以至我们常规应用的其它经验式定义&#xff08;以后会提到&#xff09;。学习信息论基础知识时要避免仅是概念与定义的简单记忆&…