算法学习(python)——2023.3.8

一、二分查找和线性查找对比

index()是线性查找  因为二分查找要求有序 index()需要适用于所有情况

二分查找的有一个循环减半 所以复杂度是o(log(n))

线性查找的复杂度是o(n)

二、排序

常见的排序算法:

1.low 冒泡排序  选择排序  插入排序

2.猛 快速排序  堆排序  归并排序

3.其他排序  希尔排序  基数排序  计数排序

三、冒泡排序

>列表每两个相邻的数,如果前面比后面大,则交换这两个数

>一趟排序完成后,无序区少一个数,有序区加一个数

如 [1,4,3,2]

1和4比 不变  4和3比 34交换 4和2比42交换,此时叫一趟  这个时候最大的数4到了最后的位置,即4进入了有序区,有序区加一个数,无序区少一个数

在数第几躺的时候 从第0开始

def bubble_sort(li):
    for i in range(len(li)-1):          #第i趟,range(n)不包括n
        for j in range(len(li)-i-1):            #指针
            if li[j] > li[j+1]:
                li[j],li[j+1] = li[j+1],li[j]

算法复杂度是o(n^2)

优化:若一趟中 没有发生交换 则停止

def bubble_sort(li):
    for i in range(len(li)-1):          #第i趟,range(n)不包括n
        exchange = False
        for 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
        print(li)
        if not exchange:
            return

冒泡排序不需要生成新列表  又叫原地排序

四、选择排序

遍历找到需要的数拿出来

def select_sort(li):
    for i in range(len(li)-1):
        min_loc = i
        for j in range(i+1,len(li)):  #从i+1遍历因为i处每次都是和min_loc一样的相当于无效比较,直接从下一位开始更好
            if li[j] < li[min_loc]:
                min_loc = j
        li[i],li[min_loc] = li[min_loc],li[i] 

五、插入排序

从无序区里随便拿出放在有序区正确的位置

先从牌堆里摸牌 下标为i  摸到后和手里的牌比较   手里的牌倒序查找 从离摸到的牌最近的位置开始找 j = i-1 并每查一次 j -= 1 并且让li[j+1] = li[j]

一个错误示例:

def insert_sort(li):
    for i in range (len(li)):
        j = i - 1
        while j >= 0 and li[j] > li[i]: #如果用li[i],当j+1=i的并且循环了一次的时候li[j+1] = li[j] = li[i] 即数值被改变了,所以要用tmp = li[i]记录数值          
            li[j+1] = li[j]
            j -= 1
        li[j+1] = li[i]

正确代码:

def insert_sort(li):
    for i in range (len(li)):#i是摸到牌的下标。实际上用range(1,len(i))也行,因为第一个摸出来不需要
        j = i -1#j是手上牌的下标  
        tmp = li[i]#记录摸到牌的值
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值