python实现的一些简单算法

#顺序查找:O(n):线性时间复杂度 - 顺序查找

#冒号 :后的list为items的注释,'被查找对象'为item的注释,而 -> 后面的int为返回值的注释
def seq_search(items:list,item:'被查找对象') -> int: #注释可以方便阅读和使用程序
    
    for index,value in enumerate(items): #十分常见!!!enumerate将一个列表转变为一个可索引序列
        if item == value:
            return index
    return -1  #return -1 与 return 1都表示程序异常终止
#一个程序只能有一个返回值,如果执行了return index 则程序将控制权还给主程序,后面的return -1不再执行,如果不执行if后面的return,则执行return -1


#二分查找:O(log_2 n):对数时间复杂度 - 折半查找
#用于有顺序的序列。这里适用于升序
def bin_search(items:list,item):
    first,end=0,len(items)
    while first<=end:
        a=(first+end)//2
        if item < items[a]:
            end=a-1
        elif item > items[a]:
            first=a+1
        else:
            return a
    return -1
            
a=[1,2,3,4,5,6]
print(seq_search(a,5))
print(bin_search(a,3))
#冒泡排序(bubble)

def bubble_sort(sorts:list) -> list: 
    for i in range(len(sorts)-1):
        for j in range(len(sorts)-1-i):
            if sorts[j] > sorts[j+1]:
                sorts[j],sorts[j+1]=sorts[j+1],sorts[j]
    return sorts


lm=[9,1,5,4,3,7,6]
print(bubble_sort(lm))

#等价于:
def bubble_sort1(sorts:list,comp=lambda x,y:x>y): 
    for i in range(len(sorts)-1):
        for j in range(len(sorts)-1-i):
            if comp(sorts[j],sorts[j+1]):
                sorts[j],sorts[j+1]=sorts[j+1],sorts[j]
    return sorts

'''
comp=lambda x,y:x>y   #:前面为参数,后面为返回值
等价于:
def comp(x,y):
    return x>y

'''
xy=[9,1,5,4,3,7,6]
print(bubble_sort1(xy))

xz=[1,5,2,6,3,9,7]
xz.sort()
print(xz) #[1, 2, 3, 5, 6, 7, 9]
xz.sort(reverse=True)
print(xz) #[9, 7, 6, 5, 3, 2, 1]
# map的返回值为一个list
# enumerate返回元组,并枚举

#递归

def fac(num):
    assert num>=0  #后面的表达式如果为假,则抛出异常AssertionError
    if num==0:
        return 1
    return num * fac(num-1)

print(fac(7))


def fib(num,result={}):
    if num in (1,2):
        return 1
    result[num]=fib(num-1)+fib(num-2)
    return result[num]
print(fib(15))
names = ['关羽', '张飞', '赵云', '马超', '黄忠']
courses = ['语文', '数学', '英语']
# 录入五个学生三门课程的成绩
# scores = [[None] * len(courses)] * len(names)
scores = [[None] * len(courses) for _ in range(len(names))]
for row, name in enumerate(names):
    for col, course in enumerate(courses):
        scores[row][col] = float(input(f'请输入{name}的{course}成绩: '))
        print(scores)
#快速排序


#import time

def quick_sort(num:list):
    if len(num)<=1:
        return num
    less = []
    greater = []
    basenum = num.pop() #将num中的最后一个元素删除,并返回该元素
    #此时num已经被删除一个元素了,故下面的循环为len(num)

    for x in range(len(num)):
        if num[x] <= basenum:
            less.append(num[x])
        else:
            greater.append(num[x])
    #time.sleep(60)
    return quick_sort(less) + [basenum] + quick_sort(greater)   #[basenum]要加框

lists=[4,8,1,3,7,9,65,41]
print(quick_sort(lists))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值