Python常见算法实现:选择、快速、二分查找、广度优先与贪婪算法
本文汇总了Python中五种常见算法的实现方法,包括选择排序、快速排序、二分查找、广度优先搜索及贪婪算法。详细解析了各算法的工作原理、适用场景及时间复杂度,并提供完整的Python代码示例,帮助开发者理解并应用这些基础算法解决实际问题。
选择排序算法实现
1、选择排序
选择排序是一种直观且基础的排序算法。其核心逻辑是:在未排序的序列中找出最小(或最大)的元素,将其放置到已排序序列的起始位置;随后从剩余未排序元素中继续寻找最小(或最大)元素,放置到已排序序列的末尾。这一过程重复执行,直至所有元素完成排序。具体实现代码如下:
#找到最小的元素def FindSmall(list):
min=list[0] for i in range(len(list)): if list[i]<min:
min=list[i] return min
#选择排序def Select_Sort(list):
newArr=[] for i in range(len(list)):
minValue=FindSmall(list)
newArr.append(minValue)
list.remove(minValue) return newArr
testArr=[11,22,33,21,123]print(Select_Sort(testArr))
快速排序算法实现
2、快速排序
快速排序的执行效率通常高于选择排序。其工作原理如下:假设待排序数组为N,首先任意选取一个数据(通常选择数组的第一个元素)作为基准值(pivot)。接着,将所有小于基准值的元素移至其左侧,所有大于基准值的元素移至其右侧,此过程称为一趟快速排序。利用Python递归方式实现该算法的代码如下:
def Quick_Sort(list): if len(list)<2: return list else:
temp=list[0]
less=[i for i in list[1:] if i<=temp]
more=[i for i in list[1:] if i>temp] return Quick_Sort(less)+[temp]+Quick_Sort(more)
testArr= [13,44,53,24,876,2]print(Quick_Sort(testArr))
二分查找算法原理与代码
3、二分查找
二分查找适用于输入为有序列表的场景,若目标元素存在于该有序列表中,该算法可返回其索引位置。举例说明:假设心中想一个1至100之间的整数,由你猜测。若从1开始逐个递增猜测,最坏情况下需猜100次(如目标为100);若采用二分策略,先猜50,根据反馈“大了”或“小了”排除一半数据,再猜75等,即可快速逼近目标。相比简单查找最多需要n步,二分查找在包含n个元素的有序列表中最多仅需log2 n步,效率显著提升。Python实现代码如下:
def Item_Search(list,item):
low=0
high=len(list)-1 while low<=high:
middle=(low+high)//2 print(list[middle]) if list[middle]>item:
high=middle-1 elif list[middle]<item:
low=middle+1 else: return middle return None
test_list=[1,3,5,7,9,11,13,15,17,19,21]
Item_Search(test_list,11)
广度优先搜索应用
4、广度优先搜索
广度优先搜索(BFS)是一种图遍历算法,图由节点和边构成,节点之间通过边连接,相连的节点互为邻居。BFS主要解决两类问题:一是判断从节点A到节点B是否存在路径;二是找出从节点A到节点B的最短路径。需注意,BFS仅适用于非加权图(即边无权重);若边有权重,应使用狄克斯特拉算法。例如,已知人际关系网络:你认识Alice、Bob、Claire;Bob认识Anuj、Peggy;Alice认识Peggy;Claire认识Tom、Jonny。若需在最短路径内通过熟人找到Tom,算法实现如下:
#使用字典构建图graph={}
graph["you"]=["Alice","Bob","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几种常见算法汇总的详细内容,更多关于Python算法汇总的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









