python算法——第四天
递归
def func(num):
if num / 2 > 0:
num -= 1
print(num)
num = func(num)
print('quit')
return num func(10)
二分查找
def binary_search(data_list,find_num):
mid_pos = int(len(data_list) / 2) # 计算需要查找数据的长度的一半
mid_val = data_list[mid_pos] # 获取中间位置的那个值
print(data_list) # 查看每次剩余筛选的数据列表
if len(data_list) > 0: # 当列表长度大于0时,则一直查找
if mid_val > find_num: # 如果中间的数比实际要查找的数大,那么这个数肯定在左边
print("%s should be in left of [%s]" % (find_num, mid_val))
binary_search(data_list[:mid_pos], find_num)
elif mid_val < find_num: # 如果中间的数比实际查找的数小,那么这个数肯定在右边
print("%s should be in right of [%s]" % (find_num, mid_val))
binary_search(data_list[mid_pos:], find_num)
else: # 如果中间数与实际查找的数恰巧相等,那么这个数肯定是要找的拿个数
print("Find %s" % find_num) else: # 否则就是买药这个数
print("cannot find [%s] in data_list" % find_num) if __name__ == '__main__':
primes = [1, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
binary_search(primes, 1) # 在列表里面查找1
二分查找二
def binary_search(array, target):
"""
二分查找
前提是数组排序好的
先把中间值找出来
当中间元素大于查找的目标元素,则将左边的索引位置移动到中间位置的下一个位置
当中间元素小于查找的目标元素,则将右边的索引位置移动到中间位置的上一个位置
当中间元素等于查找的目标元素,则停止查找,返回目标元素位置
:param array:
:param target:
:return:
"""
left = 0
right = len(array) - 1
while left <= right:
mid_position = (left + right) // 2
if array[mid_position] == target:
return mid_position
elif target < array[mid_position]:
right = mid_position - 1
else:
left = mid_position + 1
return -1
多维数组交叉
array = [[col for col in range(4)] for row in range(4)] # 初始化一个4*4数组
# array=[[col for col in 'abcd'] for row in range(4)] for row in array: # 旋转前先看看数组长啥样
print(row) for i, row in enumerate(array): for index in range(i, len(row)):
tmp = array[index][i] # 将每一列数据在每一次遍历前,临时存储
array[index][i] = array[i][index] # 将每一次遍历行的值,赋值给交叉的列
print(tmp, array[i][index]) # = tmp
array[i][index] = tmp # 将之前保存的交叉列的值,赋值给交叉行的对应值
for r in array: # 打印每次交换后的值
print(r)
冒泡排序
def bubble_sort(array):
"""
每次将后面的元素大于前面的元素交换位置
:param array:
:return:
"""
for i in range(len(array)):
for j in range(i + 1, len(array)):
if array[i] > array[j]:
array[i], array[j] = array[j], array[i]
插入排序
def insert_sort(array):
"""
找出最小位置,然后替换
:param array:
:return:
"""
for i in range(len(array)):
key = array[i]
j = i - 1
while j >= 0 and array[j] > key:
array[j + 1] = array[j]
j -= 1
array[j + 1] = key
选择排序
def select_sort(array):
"""
选则一个最小的位置,然后交换两个元素的位置
:param array:
:return:
"""
for i in range(len(array) - 1):
min_index = i
for j in range(i + 1, len(array)):
if array[j] < array[min_index]:
min_index = j
array[i], array[min_index] = array[min_index], array[i]
快速排序
def quick_sort(array):
"""
将一个数组分割为三份,一个为基数,一个是比基数大的列表,一个是比基数小的列表
然后再将比基数小的列表按照上面方式再分三份,直到分到不能再分位置
同样,也将比基数大的列表按上述分三份,直到不能再分为止
最后合并得到一个排序好的列表
:param array:
:return:
"""
if len(array) < 2:
return array
first_element = array[0]
left = [i for i in array[1:] if i <= first_element]
right = [i for i in array[1:] if i > first_element]
return quick_sort(left) + [first_element] + quick_sort(right)
快速排序二
def partition(array, p, r):
x = array[r]
i = p - 1
for j in range(p, r):
if array[j] <= x:
i = i + 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[r] = array[r], array[i + 1]
return i + 1 def quick_sort2(array, p, r):
if p < r:
q = partition(array, p, r)
quick_sort2(array, p, q - 1)
quick_sort2(array, q + 1, r)
斐波那契数列
def fibonacci(n):
a, b = 0, 1
while n > 0:
yield b
a, b = b, a + b
n -= 1
阶乘
def factorial(n):
"""
阶乘
1 * 2 * ... * n
直到n为1,则返回,然后合并相乘
:param n:
:return:
"""
# return n * factorial(n - 1) if n != 1 else n
result = 1
for i in range(1, n + 1):
result *= i
return result
线性搜索
def line_search(array, target):
"""
线性查找
按照数组顺序,依次查找目标元素
:param array:
:param target:
:return:
"""
position = 0
while position < len(array):
if array[position] == target:
return position
position += 1
return -1
python算法——第四天的更多相关文章
- python算法题 python123网站单元四题目
目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来) 下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 ...
- python算法(一)
python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...
- 安装Python算法库
安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...
- 数据结构与算法JavaScript (四) 串(BF)
串是由零个或多个字符组成的有限序列,又叫做字符串 串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的.线性表更关注的是单个元素的操作CURD,串则是关注查找子 ...
- 算法第四版 在Eclipse中调用Algs4库
首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File ...
- Python 基础语法(四)
Python 基础语法(四) --------------------------------------------接 Python 基础语法(三)------------------------- ...
- 初学 Python(十四)——生成器
初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...
- Python第二十四天 binascii模块
Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...
- java排序算法(四):冒泡排序
java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...
随机推荐
- 关于UltraISO打开iso文件后只有部分文件问题
背景:在安装CentOS 7的时候,用UltraISO打开之后,只有一个EFI文件,刻完U盘,却无法引导. 之前还以为偶没下载全,就又下了一遍,还好偶搞得的NetInstall,要不然就呵呵了. 解决 ...
- 非正规写法获取不到tr,td
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Linux内核分析--操作系统是如何工作的
“平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 一.初 ...
- try catch finally的一些用法
一:例题: package test; import javax.swing.*; class AboutException { public static void main(String[] a) ...
- XSS攻击&SQL注入攻击&CSRF攻击?
- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...
- favicon的制作
在head中插入如下标签: <link rel="shortcut icon" href="favicon.ico" />.然后把图标命名为favi ...
- poj 1321 棋盘问题
八皇后问题变形,回溯法. #include <cstdio> #include <cstring> #include <iostream> using namesp ...
- 【第三方登录】之QQ第三方登录
最近公司做了个网站,需要用到第三方登录的东西.有QQ第三方登录,微信第三方登录.先把QQ第三方登录的代码列一下吧. public partial class QQBack : System.Web.U ...
- 端口偷窃(Port Stealing)技术
端口偷窃(Port Stealing)技术 该技术主要用于局域网中间人攻击中,尤其目标计算机采用静态ARP后,导致ARP欺骗无效. 背景知识:路由器为了方便转发数据包,会在内部记录每个接口和M ...
- 5、利用控件TVCLZip和TIdFTP压缩文件并上传到FTP的线程单元pas 改进版
用到临界区 保护写日志的函数: 递归函数 删除目录下的所有文件: 循环创建或判断FTP的目录: 可改进的地方:循环压缩深层次目录的所以文件: 实现断点续传,或断点下载: {************** ...