Coursera算法第一周

现在是第三周,刚把第一周做完,要抓紧了。

首先是merge_sort算法,采用二分然后递归的方法,将时间优化到O(nlog(n))

def sort_split(a,b):
    l_a=len(a)
    l_b=len(b)
    l=l_a+l_b
    L=[]
    i=0;j=0
    for k in range(l):
        if i!=l_a and (j==l_b or a[i]<b[j]):
            L.append(a[i])
            i=i+1
        else:
            L.append(b[j])
            j=j+1
    return L
 
def sort_merge(a):
    l=len(a)
    if l==1:
        return a
    else:
        l1=a[:l/2]
        l2=a[l/2:]
        l1=sort_merge(l1)
        l2=sort_merge(l2)
        L=sort_split(l1,l2)
    return L

name=raw_input('Input text name:')
f=open(name+'.txt')
s=f.readlines()
for i in range(len(s)):
    s[i]=int(s[i].strip())
L=sort_merge(s)

    

然后是计算“逆反数”的数量,采用类似的思路,但除了计算a和b的逆反数之外,要结合a,b计算他们之间的逆反数,在最后三者相加。在实现中要用到前面提到的merge sort排序。

name=raw_input('Input text name:')
f=open(name+'.txt')
s=f.readlines()
for i in range(len(s)):
    s[i]=int(s[i].strip())

def count_inverse(a):
    l=len(a)
    if l==1:
        return a,0
    else:
        l1=a[:l/2]
        l2=a[l/2:]
        l1,c1=count_inverse(l1)
        l2,c2=count_inverse(l2)
        L,c3=count_split(l1,l2)
        return L,c1+c2+c3
def count_split(a,b):
    l_a=len(a)
    l_b=len(b)
    l=l_a+l_b
    i=0;j=0
    L=[]
    count=0
    for k in range(l):
        if i!=l_a and (j==l_b or a[i]<b[j]):
            L.append(a[i])
            i=i+1
        else:
            L.append(b[j])
            j=j+1
            count=count+(l_a-i)
    return L,count

L,c=count_inverse(s)

以上

总结一周:时间的优化,分冶思想,merge_sort算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值