现在是第三周,刚把第一周做完,要抓紧了。
首先是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算法。