Python算法学习

把教材《算法设计与分析》的C/C++理解并翻译成python
练习python+算法

冒泡排序算法

从小到大排序
这里写图片描述

def bubble_sort(lists):
    count=len(lists)
    # i=0,1,……,count-2
    for i in range(0,count-1):
        for j in range(0,count-i-1):
            if lists[j]>lists[j+1]:
            # 这一轮下来后,lists[count-i-1]就会是这次排序中遇到的最大的数,所以第一次外循环时,数组的最后一个数就是数组中最大的数
                lists[j],lists[j+1]=lists[j+1],lists[j]     
    return lists

lists=[22,55,84,21,2,4,100]
lists=bubble_sort(lists)
print lists

这里写图片描述

合并算法

将两个有序的子数组a,b,合并为一个有序的数组new

def merge(a,b):
    new = []
    m,n=0,0
    while m<len(a) and n<len(b):
        if a[m]<b[n]:
            new.append(a[m])
            m +=1
        else:
            new.append(b[n])
            n +=1

    if m<len(a):
        for num in range(m,len(a)):
            new.append(a[num])
    else:
        for num in range(n,len(b)):
            new.append(b[num])
    return new

if __name__=='__main__':
    la=[1,3,5,7,9]
    lb=[0,2,4,6,8,10,11,12]
    print(merge(la,lb))
# 输出结果:
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

插入排序算法

首先判断数组中最前面的两个元素,并使它们按照递增顺序排序;然后把第3个元素与前两个元素一次进行比较,并把它放在合适的位置,使得前面3个元素是有序的;接下来第4,第5,……直到第n个元素与前面n-1个元素一次进行比较,把它放在合适的位置,这样就成为一个有序的数组了

# 参考
def insert_sort(lists):
    # 从小到大排序
    count = len(lists)
    for i in range(1, count):
        key = lists[i]
        j = i - 1
        while j >= 0:
            if lists[j] > key:
                lists[j + 1] = lists[j]
                lists[j] = key
            j -= 1
    return lists

lists=[10,5,12,6,8]
print insert_sort(lists)

或者

def insert_sort(lists):
    # 从小到大
    for i in range(1,len(lists)):
        key=lists[i]
        for j in range(0,i):
            if lists[j]>key:
                # 开始往后挪
                k=i
                while k>=j:
                    lists[k]=lists[k-1]
                    k-=1
                lists[j]=key
# 注意这里要有一个break,不然明明已经比较并放在正确位置后会继续比较一次,然后就会有一个数不见了
                break
    return lists

lists=[10,5,12,6,8,2,88,20]
print insert_sort(lists)

二分查找法(二叉检索法)

给定一个有序的元素列表和一个数,查找该数在这个有序列表中的位置,使用二分查找每次可以排除一半的元素

# O(log n) 
def binary_search(list,item):
    low=0
    high=len(list)-1

    while low<=high:      #只要范围没有缩小到只剩一个元素
        mid=(low+high)/2
        guess=list[mid]
        if guess==item:
            return mid
        if guess > item:
            high=mid-1
        if guess < item:
            low=mid+1
    return None

#测试一下
mylist=[1,3,5,7,9]
print binary_search(mylist,3)
print binary_search(mylist,-1)
# 输出:
#   1
#   None

汉诺塔问题(递归)

将a柱子上的圆盘按一定规则借助b柱子完美地复制到c柱子上。规则:每次移动一个盘子,且只能让小的放在大的上面
算法思路:①先用c柱子作为辅助,递归调用本算法,把a最上面的n-1个圆盘移到b柱子;②再把下面的一片圆盘从a移动到c;③最后再用a作为辅助,递归调用本算法,把n-1片圆盘从b移到c。

# -*- coding: utf-8 -*-
def move(n,a,b,c):
    if n==1:
        print('将%s上的%s从%s->%s'%(a,n,a,c))
    else:
    # ①=》②=》③
        move(n-1,a,c,b)     
        print('将%s上的%s从%s->%s'%(a,n,a,c)) 
        move(n-1,b,a,c)  
#测试
move(4,'A','B','C')

好久之前写的,有点乱
参考:http://python.jobbole.com/82270/

猜你喜欢

转载自blog.csdn.net/laon_chan/article/details/79843074