1、什么是算法?

算法(Algorithm):一个计算过程,解决问题的方法

2、复习:递归

递归的两个特点:(1) 调用自身 (2)结束条件

def func1(x):print(x)func1(x-1)def func2(x):if x>0:print(x)func2(x+1)def func3(x):if x>0:print(x)func3(x-1)def func4(x):if x>0:func4(x-1)print(x)

View Code

func1和func2不是递归

func3和func4是递归,但是结果不一样,func3(5)打印的是5,4,3,2,1 而func4(5)结果是1,2,3,4,5

3、时间复杂度

时间复杂度:用来评估算法运行效率的一个东西

小结:

  时间复杂度是用来估计算法运行时间的一个式子(单位)。

  一般来说,时间复杂度高的算法比复杂度低的算法快。

  常见的时间复杂度(按效率排序)

  O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(nlogn)<O(n^3)

  不常见的时间复杂度(看看就好)

  O(n!) O(2n) O(nn) …

  如何一眼判断时间复杂度?

  循环减半的过程O(logn)

  几次循环就是n的几次方的复杂度

4、空间复杂度

  空间复杂度:用来评估算法内存占用大小的一个式子

5、列表查找

  列表查找:从列表中查找指定元素

  输入:列表、待查找元素

  输出:元素下标或未查找到元素

6、顺序查找

   从列表第一个元素开始,顺序进行搜索,直到找到为止。

7、二分查找

  从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

def bin_search(data_set,val):'''mid:下标low:每次循环的列表最左边下标high:每次循环的列表最右边下标:param data_set:列表:param val: 要找的值:return:'''low = 0high = len(data_set)-1while low <= high:mid = (low+high)//2if data_set[mid] == val:return midelif data_set[mid] > val:high = mid - 1else:low = mid + 1return

View Code

8、列表排序

  将无序列表变为有序列表

  应用场景: 各种榜单 各种表格 给二分查找用 给其他算法用

  输入:无序列表

  输出:有序列表

9、排序中比较慢的三种: 冒泡排序 选择排序 插入排序

   快速排序

   排序NB二人组: 堆排序 归并排序

没什么人用的排序: 基数排序 希尔排序 桶排序

  算法关键点: 有序区 无序区

10、冒泡排序

  首先,列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数

  n = len(list),循环了i趟(i=n-1),第i趟循环比较了(j = n-i-1 )次,j是每趟循环比较的次数 

import random,time#装饰器
def cal_time(func):def wrapper(*args,**kwargs):t1 = time.time()ret = func(*args,**kwargs)t2 = time.time()print('time cost: %s \r\nfunc from %s'%(t2-t1,func.__name__))return funcreturn wrapper@cal_time
def bubble_sort(li):for i in range(len(li) - 1):for j in range(len(li) - i - 1):#升续if li[j] > li[j+1]:li[j],li[j+1]=li[j+1],li[j]#降续# if li[j] < li[j+1]:#     li[j],li[j+1]=li[j+1],li[j]
data = list(range(1000))
random.shuffle(data)
print(data)
bubble_sort(data)
print(data)

View Code

  优化后的冒泡排序:

    如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。

import random,time#装饰器
def cal_time(func):def wrapper(*args,**kwargs):t1 = time.time()ret = func(*args,**kwargs)t2 = time.time()print('time cost: %s \r\nfunc from %s'%(t2-t1,func.__name__))return funcreturn wrapper@cal_time
def bubble_sort(li):for i in range(len(li) - 1):exchange = Falsefor j in range(len(li) - i - 1):#升续if li[j] > li[j+1]:li[j],li[j+1]=li[j+1],li[j]exchange = True#降续# if li[j] < li[j+1]:#     li[j],li[j+1]=li[j+1],li[j]#     exchange = True#这里是指上一趟,值之间没有发生交换,就退出循环if not exchange:breakdata = list(range(1000))
random.shuffle(data)
print(data)
bubble_sort(data)
print(data)

View Code

11、选择排序

  一趟遍历记录最小的数,放到第一个位置; 再一趟遍历记录剩余列表中最小的数,继续放置;

import random,time#装饰器
def cal_time(func):def wrapper(*args,**kwargs):t1 = time.time()ret = func(*args,**kwargs)t2 = time.time()print('time cost: %s --> \nfunc from %s'%(t2-t1,func.__name__))return funcreturn wrapper@cal_time
def select_sort(li):for i in range(len(li)-1):min_loc = ifor j in range(i+1,len(li)):if li[j] < li[min_loc]:min_loc = jli[i],li[min_loc] = li[min_loc],li[i]

View Code

12、插入排序

def insert_sort(li):for i in range(1,len(li)):tmp = li[i]j = i - 1while j >= 0 and tmp < li[j]:li[j + 1] = li[j]j -= 1li[j + 1] = tmp

View Code

13、练习 用冒泡法把打乱的带ID的信息表排序

import randomdef random_list(n):ids = range(1000,1000+n)result = []a1 = ["王","陈","李","赵","钱","孙","武"]a2 = ["丹","泽","","","晶","杰","金"]a3 = ["强","华","国","富","宇","齐","星"]for i in range(n):age = random.randint(16,38)id = ids[i]name = '%s%s%s'%(random.choice(a1),random.choice(a2),random.choice(a3))dic = {}dic['id'] = iddic['姓名'] = namedic['年龄'] = ageresult.append(dic)return resultdef bubble_sort(li):for i in range(len(li)-1):for j in range(len(li)-i-1):if li[j]['id'] > li[j+1]['id']:li[j],li[j+1] = li[j+1],li[j]data1 = random_list(100)
random.shuffle(data1)
print(data1)
bubble_sort(data1)
print(data1)

View Code

14、快速排序:快

  好写的排序算法里最快的

  快的排序算法里最好写的  

快排思路:

    取一个元素p(第一个元素),使元素p归位;

    列表被p分成两部分,左边都比p小,右边都比p大;

    递归完成排序。

#快排的复杂度是O(nlog(n)),这是一个特殊情况 #口诀 右手左手一个慢动作,右手左手慢动作重播(递归)

import time,random,copydef cal_time(func):def wrapper(*args,**kwargs):t1 = time.time()ret = func(*args,**kwargs)t2 = time.time()print('time cost: %s from %s'%(t2-t1,func.__name__))return funcreturn wrapperdef quick_sort_x(data,left,right):#这里的left和right是定义列表data,最少有两个元素if left<right:#partition分割函数,mid是放好的元素的下标mid = partition(data,left,right)#以下类似二分quick_sort_x(data,left,mid-1)quick_sort_x(data,mid+1,right)#快排的复杂度是O(nlog(n)),这是一个特殊情况
def partition(data,left,right):#获取左边的第一个元素,这里写left不能写零,因为后面需要递归tmp = data[left]#终止条件为当left和right碰上时,所以左小于右时为while循环的条件(left和right是下标)while left < right:#循环条件是右边比tmp大,直到找到右边比tmp小的数,停止循环while left < right and data[right] >= tmp:right -= 1#把找到的右边比tmp小的数移到左边空出来的位置data[left] = data[right]#循环条件是左边比tmp小,继续循环,直到找到左边比tmp大的数,结束循环while left < right and data[left] <= tmp:left += 1#把左边找到的大于tmp的数移到右边空出来的位置data[right] = data[left]#当左右相等时,就把tmp放到left和right碰到的位置data[left] = tmp#mid的值和lef或right值相同,return哪个都可以#mid = left# return midreturn left#对递归函数的装饰,需要再封装一层
@cal_time
def quik_sort(data):#0及是left,len(data)-1为rightreturn quick_sort_x(data,0,len(data)-1)

View Code

import time,random,copydef cal_time(func):def wrapper(*args,**kwargs):t1 = time.time()ret = func(*args,**kwargs)t2 = time.time()print('time cost: %s from %s'%(t2-t1,func.__name__))return funcreturn wrapperdef quick_sort_x(data,left,right):#这里的left和right是定义列表data,最少有两个元素if left<right:#partition分割函数,mid是放好的元素的下标mid = partition(data,left,right)#以下类似二分quick_sort_x(data,left,mid-1)quick_sort_x(data,mid+1,right)#快排的复杂度是O(nlog(n)),这是一个特殊情况
def partition(data,left,right):#获取左边的第一个元素,这里写left不能写零,因为后面需要递归tmp = data[left]#终止条件为当left和right碰上时,所以左小于右时为while循环的条件(left和right是下标)while left < right:#循环条件是右边比tmp大,直到找到右边比tmp小的数,停止循环while left < right and data[right] >= tmp:right -= 1#把找到的右边比tmp小的数移到左边空出来的位置data[left] = data[right]#循环条件是左边比tmp小,继续循环,直到找到左边比tmp大的数,结束循环while left < right and data[left] <= tmp:left += 1#把左边找到的大于tmp的数移到右边空出来的位置data[right] = data[left]#当左右相等时,就把tmp放到left和right碰到的位置data[left] = tmp#mid的值和lef或right值相同,return哪个都可以#mid = left# return midreturn left#对递归函数的装饰,需要再封装一层
@cal_time
def quik_sort(data):#0及是left,len(data)-1为rightreturn quick_sort_x(data,0,len(data)-1)#冒泡排序
@cal_time
def bubble_sort(li):for i in range(len(li) - 1):exchange = Falsefor j in range(len(li) - i - 1):#升续if li[j] > li[j+1]:li[j],li[j+1]=li[j+1],li[j]exchange = True#降续# if li[j] < li[j+1]:#     li[j],li[j+1]=li[j+1],li[j]#     exchange = True#这里是指上一趟,值之间没有发生交换,就退出循环if not exchange:breakdata = list(range(5000))
random.shuffle(data)
#深度拷贝
data1 = copy.deepcopy(data)
data2 = copy.deepcopy(data)#快排和冒泡的比较
quik_sort(data1)
bubble_sort(data2)
print(data1)

View Code

升续:

降续:

排序速度的定义:

一般情况下快排比冒泡快,快排有递归深度的问题,如果深度高的话,需要调整。

15、堆排序

(1)树与二叉树简介

  树是一种数据结构 比如:目录结构

  树是一种可以递归定义的数据结构

  树是由n个节点组成的集合:

    如果n=0,那这是一棵空树;

    如果n>0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一棵树。

  一些概念

    根节点、叶子节点

    树的深度(高度)

    树的度

    孩子节点/父节点 子树

  

(2)二叉树

  二叉树:度不超过2的树(节点最多有两个叉)

  

(3)满二叉树,完全二叉树

(4)二叉树的存储方式

  链式存储方式

  顺序存储方式(列表)

  

  父节点和左孩子节点的编号下标有什么关系?

  0-1 1-3 2-5 3-7 4-9

  i ~ 2i+1

  父节点和右孩子节点的编号下标有什么关系?

  0-2 1-4 2-6 3-8 4-10

  i ~ 2i+2

(5)小结

  二叉树是度不超过2的树

  满二叉树与完全二叉树

  (完全)二叉树可以用列表来存储,通过规律可以从父亲找到孩子或从孩子找到父亲

(6)堆排序

  大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大

  小根堆:一棵完全二叉树,满足任一节点都比其孩子节点小

(7)堆排序过程

  a、建立堆

  b、得到堆顶元素,为最大元素

  c、去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。

  d、堆顶元素为第二大元素。

  e、 重复步骤3,直到堆变空。

  

转载于:https://www.cnblogs.com/willpower-chen/p/6510388.html

python自动开发之(算法)第二十七天相关推荐

  1. python自动开发环境_Python2.7.12开发环境构建(自动补全)

    一.安装readline-devel包 Python的编译安装依赖于这个包 yum -y install readline-devel 二.安装Python2.7.12 # tar xf Python ...

  2. 媒智科技--深度学习算法Python后台开发--热招中~

    点击我爱计算机视觉标星,更快获取CVML新技术 公司简介 媒智科技源起于上海交通大学,核心团队由上海交大.清华.斯坦福.乔治亚理工等顶尖高校的人工智能教授,以及来自雅虎.腾讯等科技精英组成,聚焦计算机 ...

  3. 【正点原子FPGA连载】第二十七章DS18B20数字温度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  4. 【正点原子STM32连载】 第二十七章 RTC实时时钟实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  5. 八十七、Python | 十大排序算法系列(上篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  6. Python之父推荐!《Python 3网络爬虫开发实战》第二版!文末送签名版!

    很多读者会让我写爬虫方面的书籍,我也一直没写,没写的原因主要有两个,第一个就是在爬虫方面我其实不是很擅长,第二个原因就是因为在爬虫领域庆才已经做的足够好了,我写不一定能写出庆才这水平的,所以也就一直没 ...

  7. 自动驾驶决策规划算法第二章——Apollo EM Planner实践篇

    前置学习内容:自动驾驶控制算法 [自动驾驶][零基础]基础自动驾驶控制算法笔记_免费教学录影带的博客-CSDN博客 自动驾驶决策规划第一章 自动驾驶决策规划算法第一章_免费教学录影带的博客-CSDN博 ...

  8. 数据分析真题日刷 | 商汤科技2018校招C++/算法开发/大数据/后端/运维/测试/数据挖掘开发工程师笔试第二场

    断了大半个月没有刷题,进入「数据分析真题日刷」系列第13篇 . 今日真题 商汤科技2018校招C++/算法开发/大数据/后端/运维/测试/数据挖掘开发工程师笔试第二场 (来源:牛客网) 题型 客观题: ...

  9. 【正点原子MP157连载】第二十七章 DHT11数字温湿度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. Learn OpenGL (七):摄像机
  2. 浏览器是怎样工作的(一):基础知识
  3. 赠书:Kotlin在Spring Boot中的应用
  4. matlab 1 f噪声,跪求1/f噪声生成代码解释!!
  5. 使用Flutter之后,我们的CPU占用率降了50%
  6. 为什么手机垃圾就是治不了?
  7. ThreadLocal相关
  8. 倍增LCA code[vs]1036商务旅行
  9. SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式
  10. vue-router(2.0)
  11. 诸葛亮的十堂课:在变局中安身立命,在逆境中找到力量
  12. 基本概念1 IC设计流程
  13. NYOJ--1A+B Problem(练手题)
  14. swith case
  15. nebula模拟器_Nebula街机模拟器使用方法 Nebula街机模拟器怎么用
  16. 开发文件管理器-2015年9月19日
  17. 电脑钢琴模拟器(初学WINDOW库)
  18. spark整合hive
  19. QT QLineEdit焦点和键盘问题
  20. Linux aarch64 编译 qemu 搭建实验平台

热门文章

  1. IDEA设置单个文件、单个包、单个项目的编码格式
  2. GitHub 中 Merge pull request 的 3 中选项说明
  3. C++ 笔记(27)— 指针变量、数组和指针、指针数组、数组指针、指针常量与常量指针
  4. 如何在本地访问远程服务器的jupyter notebook?
  5. 彻底解决python打印结果省略号的问题显示宽度
  6. 手机与Camera CCM技术发展趋势
  7. Waymo的自主进化
  8. 客快物流大数据项目(十二):Docker的迁移与备份
  9. Cocos生命周期回调
  10. C++ map 的使用