算法入门

算法入门

冒泡排序,每一次循环把最大的数放到列表最后

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)

转载于:https://www.cnblogs.com/ops-sylar/p/6402770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值