算法

算法

学习至算法图解

1. 二分查找

原理:对于一组有序数据,每次从数据的中间开始查找,假如中间值正好与查找值相等,那表示已经找到;假如不等,则把数据组从中间分成前组和后组,如果需查找的数据比中间数大,则取后组再次进行查找,重复以上过程,直至找到。
时间复杂度:O(log2n)

Python实现:

def binary_search(li,item):
    low=0
    high=len(li)-1
    while low<=high:
        mid_index=int((low+high)/2)
        mid=li[mid_index]
        if item==mid:
            return mid_index
        elif item<mid:
            high=mid_index-1
        else:
            low=mid_index+1
    return None

测试:

li=[2,3,4,7,8,9,22,33,44,55,100]
item=55
#从li中查找55这个值,返回55的索引
index=binary_search(li,item)
li[index]·········返回55

2. 选择排序

原理:遍历未排序的的列表找出最小的值,然后把这个值取出放进另一个空列表中,再次这样做,找出第二小的值放入新列表中,以此类推,最终你会得到一个有序列表。

时间复杂度:O(n^2)

Python实现:

def getsmallest(li):
    small_index=0
    smallest=li[0]#存储最小的值
    for i in range(len(li)):
        if li[i]<smallest:
            small_index=i
            smallest=li[i]
    return small_index
            
def selectSort(li):
    new_li=[]
    for i in range(len(li)):
        index=getsmallest(li)
        new_li.append(li.pop(index))
    return new_li

测试:

selectSort([3,2,4,1,5,7,3,2,5,78,3,7,3,6,])
#
#返回:
[1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 7, 7, 78]

4.分而治之

原理:1.找到一个基线条件(这个条件必须尽可能简单),2.不断将问题分解(或者说缩小规模),直到符合基线条件)

1.使用递归来实现列表求和

def sum(li):
    a=0
    for i in li:
        a=a+i
    return a

2.编写一个递归函数来计算列表所包含的元素数

def count(li):
    if not li:
        return 0
    else:
        return 1+count(li[1:])

3.找出列表中的最大数字

def getLargest(li):
    #基线条件,当列表中只剩下两个元素时发动
    if len(li)==2:
        if li[0]<=li[1]:
            return li[1]
        else:
            return li[0]
    sub_max=getLargest(li[1:])
    if li[0]>sub_max:
        return li[0]
    else:
        return sub_max

待续

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值