Python几种常见算法汇总


Posted in Python onJune 02, 2020

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,首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。可以使用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步,而二分查找法则最多只需lon2 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、广度优先搜索

广度优先搜索是一种图算法,图由节点和边组成,一个节点可能与多个节点连接,这些节点称为邻居。广度优先搜索算法可以解决两类问题:第一类是从节点A出发,有没有前往节点B的路径;第二类问题是从节点A出发,前往B节点的哪条路径最短。使用广度优先搜索算法的前提是图的边没有权值,即该算法只用于非加权图中,如果图的边有权值的话就应使用狄克斯特拉算法来查找最短路径。举个例子,假如你认识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算法汇总的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现2048小游戏
Mar 30 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 Python
opencv-python的RGB与BGR互转方式
Jun 02 #Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 #Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 #Python
基于pycharm实现批量修改变量名
Jun 02 #Python
pytorch读取图像数据转成opencv格式实例
Jun 02 #Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 #Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 #Python
You might like
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
php字符串截取问题
2006/11/28 PHP
PHP的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php把数组值转换成键的方法
2015/07/13 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
javascript innerText和innerHtml应用
2010/01/28 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
vue.js todolist实现代码
2017/10/29 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
PyQt 线程类 QThread使用详解
2017/07/16 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
求职简历的自我评价怎样写好
2013/10/07 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
民主生活会发言材料
2014/10/20 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
土建施工员岗位职责
2015/04/11 职场文书
公司员工奖惩制度
2015/08/04 职场文书
筑梦中国心得体会
2016/01/18 职场文书
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android