python语言中有算法吗


Posted in Python onJune 16, 2020

了解算法之前,我们先看一下什么是算法

定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

python中的常见算法

冒泡排序

效率:O(n2)

原理:

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

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。做完以后,最后的元素会是最大的数,这里可以理解为走了一趟;

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

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,最后数列就是从大到小一次排列;

def bubble_sort(data):
  """
  冒泡排序
  :param data: 
  :return: 
  """
  for i in range(len(data)-1): # 趟数
    for j in range(len(data)-i-1): # 遍历数据,依次交换
      if data[j]>data[j+1]: # 当较大数在前面
        data[j],data[j+1]=data[j+1],data[j] #交换两个数的位置
 
if __name__=='__main__':
  import random
  data_list=list(range(30))
  random.shuffle(data_list)
  print("pre:",data_list)
  bubble_sort(data_list)
  print("after:",data_list)
#结果:
#pre: [22, 11, 19, 16, 12, 18, 20, 28, 27, 4, 21, 10, 9, 7, 1, 6, 5, 29, 8, 0, 17, 26, 13, 14, 15, 24, 25, 23, 3, 2]
#after: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

选择排序

效率:O(n2)

原理:

每一次从待排序的列表中选出一个元素,并将其与其他数依次比较,若列表中的某个数比选中的数小,则交换位置,把所有数比较完毕,则会选出最小的数,将其放在最左边(这一过程称为一趟);

重复以上步骤,直到全部待排序的数据元素排完;

demo:

def select_sort(data):
  """
  选择排序
  :param data: 待排序的数据列表
  :return: 
  """
  for i in range(len(data)-1): #趟数
    min_index=i # 记录i趟开始最小的数的索引,我们从最左边开始
    for j in range(i+1,len(data)): # 每一次趟需要循环的次数
      if data[j] < data[min_index]: # 当数列中的某一个数比开始的数要小时候,更新最小值索引位置
        min_index=j
    data[i],data[min_index]=data[min_index],data[i] # 一趟走完,交换最小值的位置,第一趟最小
if __name__=='__main__':
  import random
  data_list=list(range(30))
  random.shuffle(data_list) # 打乱列表数据
  print("pre:",data_list)
  select_sort(data_list)
  print("after:",data_list)
#结果:
#pre: [20, 11, 22, 0, 18, 21, 14, 19, 7, 23, 27, 29, 24, 4, 17, 15, 5, 10, 26, 13, 25, 1, 8, 16, 3, 9, 2, 28, 12, 6]
#after: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

插入排序

效率:O(n2)

原理:

以从小到大排序为例,元素0为第一个元素,插入排序是从元素1开始,尽可能插到前面。

插入时分插入位置和试探位置,元素i的初始插入位置为i,试探位置为i-1,在插入元素i时,依次与i-1,i-2······元素比较,如果被试探位置的元素比插入元素大,那么被试探元素后移一位,元素i插入位置前移1位,直到被试探元素小于插入元素或者插入元素位于第一位。

重复上述步骤,最后完成排序

demo:

def insert_sort(data):
  """
  插入排序
  :param data: 待排序的数据列表
  :return: 
  """
  for i in range(1, len(data)): # 无序区域数据
    tmp = data[i] # 第i次插入的基准数
    for j in range(i, -1, -1):
      if tmp < data[j - 1]: # j为当前位置,试探j-1位置
        data[j] = data[j - 1] # 移动当前位置
      else: # 位置确定为j
        break
    data[j] = tmp # 将当前位置数还原
 
if __name__=='__main__':
  import random
  data_list=list(range(30))
  random.shuffle(data_list) # 打乱列表数据
  print("pre:",data_list)
  insert_sort(data_list)
  print("after:",data_list)
#结果:
#pre: [7, 17, 10, 16, 23, 24, 13, 11, 2, 5, 15, 29, 27, 18, 4, 19, 1, 9, 3, 21, 0, 14, 12, 25, 22, 28, 20, 6, 26, 8]
#after: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

堆排序

堆定义:本质是一个完全二叉树,如果根节点的值是所有节点的最小值称为小根堆,如果根节点的值是所有节点的最大值,称为大根堆。

效率:O(nlogn)

原理:

将待排序数据列表建立成堆结构(建立堆);

通过上浮(shift_up)或下沉(shift_down)等操作得到堆顶元素为最大元素(已大根堆为例);

去掉堆顶元素,将最后的一个元素放到堆顶,重新调整堆,再次使得堆顶元素为最大元素(相比第一次为第二大元素);

重复3操作,直到堆为空,最后完成排序;

归并排序

效率:O(nlogn)

空间复杂度:O(n)

原理:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

设定两个指针,最初位置分别为两个已经排序序列的起始位置;

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

重复步骤3直到某一指针达到序列尾;

将另一序列剩下的所有元素直接复制到合并序列尾。

到此这篇关于python语言中有算法吗的文章就介绍到这了,更多相关python里有算法吗内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
浅析python redis的连接及相关操作
Nov 07 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 Python
python实现控制台输出颜色
Mar 02 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
python爬虫可以爬什么
Jun 16 #Python
通过cmd进入python的步骤
Jun 16 #Python
解决Keras 自定义层时遇到版本的问题
Jun 16 #Python
Keras实现支持masking的Flatten层代码
Jun 16 #Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 #Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 #Python
记录模型训练时loss值的变化情况
Jun 16 #Python
You might like
基于文本的访客签到簿
2006/10/09 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Python脚本调试工具安装过程
2021/01/11 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
给排水专业应届生求职信
2013/10/12 职场文书
销售找工作求职信
2013/12/20 职场文书
书法培训心得体会
2014/01/05 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
《大海那边》教学反思
2014/04/09 职场文书
毕业生就业协议书
2014/04/11 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技