[日常学习]灵感来自MergeSort的求逆序数...

#!/usr/bin/python


def countsplit(l,r) :
	l = sorted(l)
	r = sorted(r)
	i = 0
	j = 0
	c = 0
	while(i < len(l) and j < len(r)) :
		if(l[i] <= r[j]) :
			i+=1
		else :
			c+=len(l)-i	
			j+=1
	return c

def count(array) :
	if len(array) == 1 :
		return 0
	l = array[0:len(array)/2]
	r = array[len(array)/2:]
	lc = count(l)
	rc = count(r)
	s = countsplit(l,r)
	return s+lc+rc

s = raw_input()
a = [int(x) for x in s.split(' ')]
print count(a)

依然有些不懂的地方,不知道为什么是O(nlogn)而不是O(n(logn)^2)...

主要是其中调用了一次sort.

Update:

 之前复杂度没分析对是因为代码写错了....

#!/usr/bin/python


def countsplit(l,r) :
	i = 0
	j = 0
	c = 0
	s = []
	while i < len(l) and j < len(r) :
		if(l[i] <= r[j]) :
			s.append(l[i])
			i+=1
		else :
			c+=len(l)-i	
			s.append(r[j])
			j+=1
	while i < len(l) :
		s.append(l[i])
		i+=1
	while j < len(r) :
		s.append(r[j])
		j+=1
	return s,c

def count(array) :
	if len(array) <= 1 :
		return array,0
	l = array[0:len(array)/2]
	r = array[len(array)/2:]
	l,lc = count(l)
	r,rc = count(r)
	s,sc = countsplit(l,r)
	return s,sc+lc+rc

s = raw_input()
a = [int(x) for x in s.split(' ')]
a,ac = count(a)
print ac

不该sort的...应该是来自merge sort.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值