insertion mergesort bubble sort 复习 python

最近重新开始复习算法那本书,整理了一下关于insertion mergesort以及 divide and conquer的思路


insertion sort is O(n^2)  best case when it is already sorted it will be O(n) worse case is the array is reversed sorted.

the main idea is we put an iterator in the array and make sure everything infront of the iterator is sorted.


for index in range(1,len(array)): 

key=arrray[index]

j=index

while j>0 and array[j-1]>key://如果比当前的大就往后移动,得到的是递增的序列

array[j]=array[j-1]

j-=1

array[index]=key


def insertion(num):
    for index in range(1,len(num)):
        key=num[index]
        j=index
        while j>0 and num[j-1]>key:
            num[j]=num[j-1]
            j-=1
        num[j]=key


关于mergesort的思路是将整个array每次除以2往下分,直到长度为1,然后依次排列 

所以整个array可以分成

n

n/2 n/2

n/4 n/4 n/4 n/4

.....一共log(n)层

每层排列需要n次运算因此为nlogn


def mergesort(num):
    if len(num)==1:
        return num
    def merge(left,right):
        merged=[]
        while left and right:
            merged.append(left.pop(0) if left[0]<=right[0] else right.pop(0))
        while left:
            merged.append(left.pop(0))
        while right:
            merged.append(right.pop(0))
        return merged
    mid=len(num)/2
    left=mergesort(num[:mid])
    right=mergesort(num[mid:])
    return merge(left,right)


除此以外bubble sort是最最基本的算法。

就不具体阐述了。

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


radix sort.

def radixsort(num):
    radix=10
    tmp,placement=-1,1
    maxlen=False
    while not maxlen:
        maxlen=True
        buckets=[list() for _ in range(radix)]
        for i in num:
            tmp=i/placement
            buckets[tmp%radix].append(i)
            if maxlen and tmp>0:
                maxlen=False
        a=0
        for b in range(radix):
            buck=buckets[b]
            for i in buck:
                num[a]=i
                a+=1
        placement*=radix
    print num
def main():
    num=[18,5,100,3,1,19,6,0,7,4,2]
    radixsort(num)
    print num
if __name__=="__main__":
    main()


heap sort

def siftdown(a,start,end):
    root=start
    while 2*root+1<end:
        child = 2*root+1
        if child+1<=end and a[child]<a[child+1]:
            child+=1
        if a[root]<a[child]:
            a[root],a[child]=a[child],a[root]
            root=child
        else:
            return


def heapify(a):
    start=(len(a)-2)/2
    while start>=0:
        siftdown(a,start,len(a)-1)
        start-=1
    end=len(a)-1
    while end>0:
        a[end],a[0]=a[0],a[end]
        end-=1
        siftdown(a,0,end)
    return a


def main():
    num=[8,1,2,9,11,10,4,5,100]
    
    print heapify(num)
if __name__=="__main__":
    main()
    
        



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值