在最坏情况下,找到n个元素中第二小的元素需要n+向上取整lgn-2次比较。
class Num(object):
def __init__(self, num):
self.num=num
self.compared=list()
def __repr__(self):
return "{0},{1}".format(self.num, self.compared)
def __cmp__(self, obj):
self.compared.append(obj.num)
obj.compared.append(self.num)
res = cmp(self.num, obj.num)
if res==0:
self.compared.extend(obj.compared)
obj.compared.extend(self.compared)
return res
def get_the_last_but_one(L):
assert len(L) >= 2
length = len(L)
L = [Num(ele) for ele in L]
for i in xrange(length-1):
ele1, ele2 = L[0], L[1]
del L[0], L[0]
if ele1<=ele2:
L.append(ele1)
else:
L.append(ele2)
assert len(L) == 1
compared = L[0].compared
the_last_but_one = min(L[0].compared)
return the_last_but_one
if __name__ == "__main__":
import sys
L = sys.argv[1:]
if not L:
import random
L = [random.randint(1, 10) for i in xrange(10)]
print L
print get_the_last_but_one(L)