算法入门
算法入门
冒泡排序,每一次循环把最大的数放到列表最后
data = [84984,4566,843,8424,514,56,4564,4561,31,5,18,1,6514564,94,48,54,1231,45]
count = 0 #计数器,记录循环次数
for j in range(1, len(data)): #每次循环排除最后一个最大的数进入下次循环,不能直接用data循环,因为data读入内存后,直接操作data会产生一个新的内存地址保存修改后的数据,造成程序紊乱!
for i in range(len(data)-j): #用列表长度进行循环这个循环会把最大的数放在列表最后的位置,通过上一层循环排除最后一个,就可以做到从小到大排列
if data[i] > data[i+1]:
tmp = data[i+1]
data[i+1] = data[i]
data[i] = tmp
count += 1
print(data,count)
递归
def calc(n):
if n/2 > 1:
res = calc(n/2)
print("res", res)
#return n
print("n:", n)
return n
calc(10)
递归就是重复的执行函数自身,递归的函数会一层一层的进入下一个函数执行,
退出也是一层一层的退出.在注释的地方return就会直接从最里面的一层函数跳出
斐波那契数列
def func(arg1, arg2, stop):
if arg1 > 0 :
print(arg1, arg2)
arg3 = arg1 + arg2
print(arg3)
if arg3 < stop:
func(arg2, arg3,stop)
func(2, 5, 1000)
二分法,只能查找有序序列.
def binary_search(data, find_num):
mid = int(len(data)/2)
if len(data) >= 1:
if data[mid] > find_num:
binary_search(data[:mid], find_num)
elif data[mid] < find_num:
binary_search(data[mid:], find_num)
else:
print(data[mid])
else:
print("cannot find...")
li = list(range(1,9999999))
binary_search(li, 2311)
2维数组旋转
data = [[i for i in range(4)] for j in range(4)]
for i in data:
print(i)
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]
for row_index,row in enumerate(data):
for col_index in range(row_index, len(row)):
tmp = data[col_index][row_index]
data[col_index][row_index] = row[col_index]
data[row_index][col_index] = tmp
for i in data:
print(i)
[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
for i in range(len(data)):
a = [data[i][i] for row in range(4)]
print(a)
时间复杂度T(n)
指数时间:数据线性增长,程序执行时间指数成长O(n2)
常数时间:相当与已知数据的位置去读取数据所花时间 O(n)
对数时间:常见二叉树和二分搜索,数据增长对执行时间影响不大O(log n)
线性时间:运行时间和数据增长成线性关系, O(n)