算法导论学习之旅(python实现)

第二章

均为个人实现,没有完全按照书中方式去做,因为感觉书中算法实现太多是按照C的方式,如果按部就班按照它的思路写代码,没有完全体现Python语言特征,因此我的算法主要是针对python语言特性来做的。

  1. 插入排序
    插入排序原理
def insert_sort(list):
    i=0
    for j in range(1,len(list)):
        key=list[j]
        i=j-1
        while(i>0 & list[i]>key):
            list[i+1]=list[i]
            i=i-1
        list[i+1]=key
        return

2.递归插入实现

#思路是正确的。然而切片不支持深拷贝,所以运行有误,后一种类似于java版本的写法
'''
def insert_digui_sort(list):
    if(len(list)>1):
        key = list[-1]
        insert_digui_sort(list[:-1])
    #digui
        length=len(list)-2
        while(list[length]>key and length>-1):
            list[length+1]=list[length]
            length=length-1
        list[length+1]=key
'''


def insert_recursion_sort(list,n):
    if(n>1):
        n=n-1
        insert_recursion_sort(list,n)
    #digui
        length=n-1
        key = list[length+1]
        while(list[length]>key and length>-1):
            list[length+1]=list[length]
            length=length-1
        list[length+1]=key

    if (n==len(list)-1):
        return list
    else:
        return

3.二分查找

def binary_find(value,list):
    length=len(list)
    start=0
    end=length-1
    mid=(int)((start+end)/2)
    while(1):
        if(list[mid]==value):
            return mid
        if(list[mid]>value):
            end=mid-1
            mid = (int)((start + end) / 2)
        else:
            start=mid+1
            mid = (int)((start + end) / 2)

4.二分查找递归版

def binary_recur_find(value,list):
    length = len(list)
    start=0
    end=length-1
    def find(start,end):
        mid = (int)((start + end ) / 2)
        if(list[mid]==value):
            return mid
        if(list[mid]>value):
            end=mid-1
            return find(start, end)
        else:
            start=mid+1

            return find(start, end)
    return find(start,end)

网上找的简洁写法

> def binary_find(value,list):
    low=0;
    high=len(list)-1
    while(low<=high):
        mid=int((low+high)/2)
        if(value==list[mid]):
            return mid
        if(value > list[mid]):
            low=mid+1
        elif(value < list[mid]):
            high=mid-1

5.分治之合并排序合并排序
需要会推复杂度
递归树

def merge_sort(li):
    def divide(li):
        if(len(li)>1):
            l1=li[0:(int)(len(li)/2)]
            l2=li[(int)(len(li)/2):]
        else:
            return li
        return merge(divide(l1),divide(l2))
    def merge(list1,list2):
        len1=len(list1)
        len2=len(list2)
        li=[]
        m=0
        n=0
        i=0
        while(i<len1+len2 and m<len1 and n<len2):
            if list1[m]<=list2[n]:
                li.append(list1[m])
                m=m+1
                i=i+1
            elif(list1[m]>list2[n]):
                li.append(list2[n])
                n=n+1
                i = i + 1
        if(m<len1):
            li.extend(list1[m:])
        elif(n<len2):
            li.extend(list2[n:])
        return li
    return divide(li)

算法上本人依然是菜鸟,如有疏漏,恳请指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值