本文将详细讲解几种常见的Python算法实现,文章内容质量较高,所以边肖将分享给大家参考。希望大家看完这篇文章后对相关知识有一定的了解。
1.选择排序。
选择性排序是一种简单直观的排序算法。其原理如下:首先,在未排序的序列中找到最小(大)元素,并将其存储在排序序列的开头;然后,继续从剩余的未排序元素中搜索最小的(大的)元素,然后将其放在排序后的序列后面,以此类推,直到所有元素都被排序。该算法实现如下:
#找到了最小的元素deffindmall(列表):
min=list[0]for line range(len(list)): if list[I]min :
min=list[i]returnmin
#选择排序定义选择_排序(列表):
newArr=[]for iirange(len(list)):
最小值=查找小(列表)
new err . append(MinVaLue)
list.remove(minValue)返回新值
testar=[11,22,33,21,123]print(select _ sort(testar))2。快速分类。
快速排序运行速度比选择性排序快,其工作原理如下:让要排序的数组为n,首先选择任意数据(通常是数组的第一个数字)作为关键数据,然后将所有小于它的数字放在前面,所有大于它的数字放在后面。这个过程叫做快速排序。您可以使用python递归地解决这个问题:
defQuick_Sort(列表):iflen(列表)2:returnlistelse:
temp=列表[0]
less=[iforiinlist[1:]ifi=temp]
more=[iforiinlist[1:]if temp]returnQuick _ Sort(更少)[temp] Quick_Sort(更多)
testar=[13,44,53,24,876,2]print(quick _ sort(testar))3。二分搜索法。
二分搜索法的输入是一个有序列表。如果要搜索的元素包含在有序列表中,二分搜索法可以返回它的位置。我们用一个类比来说明二分搜索法的原理:比如我随机想到一个1~100范围内的整数,你用最少的次数猜出这个数。每次你猜完给一个数字,我都会回复是大还是小。第一种方法是你从1开始,然后依次猜测。如果我要的数字是100,那么你要猜100次。第二种方法是从50开始。如果我说太小,那么你可以猜75,从而依次消除剩余数字的一半。这就是二分搜索法方法。可以看出,二分搜索法方法更快。对于包含n个元素的有序列表,简单搜索最多需要n步,而二分搜索法算法最多只需要lon2 n步。下面的算法是用python实现的:
defItem_Search(列表,项目):
低=0
high=len(列表)-1whilelow=high:
middle=(低高)//2 print(list[middle])if list[middle]item :
high=middle-1 liflist[middle]项目:
low=中1 LSE : returnmiddlereturnnone
test_list=[1,3,5,7,9,11,13,15,17,19,21]
项目_搜索(测试_列表,11)4。广度优先搜索。
广度优先搜索是一种由节点和边组成的图算法。一个节点可以连接多个节点,这些节点称为邻居。广度优先搜索算法可以解决两类问题:第一类是节点A到节点B是否有路径;第二个问题是从节点A到节点b哪条路径最短,使用广度优先搜索算法的前提是图的边没有权重,即该算法只用于未加权的图。如果图的边有权重,则应使用Dikstra算法来寻找最短路径。例如,如果你认识爱丽丝、鲍勃和克莱尔,鲍勃认识anuj和peggy,爱丽丝认识peggy,克莱尔认识tom和jonny,你需要在最短路径中找到你认识的人来找到tom,那么算法实现如下:
#使用字典构建图表图表={}。
图['你']=['爱丽丝',' B
ob","Claire"]
graph["Bob"]=["Anuj","Peggy"]
graph["Alice"]=["Peggy"]
graph["Claire"]=["Tom","Jonny"]
graph["Anuj"]=[]
graph["Peggy"]=[]
graph["Tom"]=[]
graph["Jonny"]=[]from collections import deque#简单的判断方法def person_is_seller(name): return name=='Tom'def Search(name):
searched=[] #用于记录检查过的人,防止进入死循环
search_queue=deque() #创建队列
search_queue+=graph[name] while search_queue:
person=search_queue.popleft() if not person in searched: #仅当这个人没检查过时才检查
if person_is_seller(person): print("the seller is {0}".format(person)) return True else:
search_queue+=graph[person]
searched.append(person) #将这个人标记为检查过
return Falseprint(Search("you"))
5、贪婪算法
贪婪算法,又名贪心算法,对于没有快速算法的问题(NP完全问题),就只能选择近似算法,贪婪算法寻找局部最优解,并企图以这种方式获得全局最优解,它易于实现、运行速度快,是一种不错的近似算法。假如你是个小偷,商店里有很多箱子,箱子里有各种水果,有些箱子里有3种水果,有些箱子有2种...,你想尝到所有种类的水果,但你一个人力气有限,因此你必须尽量搬走最少的箱子,那么,算法实现如下:
fruits=set(["苹果","香蕉","梨子","西瓜","草莓","橘子","荔枝","榴莲"]) #箱子以及包含的水果box={} box["b1"]=set(["苹果","香蕉","西瓜"]) box["b2"]=set(["草莓","橘子","榴莲"]) box["b3"]=set(["梨子","荔枝","草莓"]) box["b4"]=set(["香蕉","橘子"]) box["b5"]=set(["梨子","榴莲"]) final_boxs=set() #最终选择的箱子#直到fruits为空while fruits: best_box=None #包含了最多的未包含水果的箱子 fruits_covered=set() #包含该箱子包含的所有未包含的水果 #循环迭代每个箱子,并确定它是否为最佳箱子 for boxItem,fruitItem in box.items(): covered=fruits & fruitItem #计算交集 if len(covered)>len(fruits_covered): best_box=boxItem fruits_covered=covered fruits-=fruits_covered final_boxs.add(best_box) print(final_boxs)
关于几种常见的Python算法实现分别有哪些就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/48484.html