题目中说了不允许用排序算法,但是中位数,这个很容易联想到快排。那就是可以用快排的思想。
任意挑选一个元素,以该元素为key, 划分数组为两个部分,如果左侧数组长度刚好为(n-1)/2, 那么key就为中位数, 若左侧数组长度 < (n-1)/2 , 那么中位数点在右侧,反之,中位数在左侧。然后进入相应的一侧继续寻找中位
class Solution(object):
def findmedian(self, lists):
if not lists:
return None
n=len(lists)
if n%2==0:
l=quicksort(lists,n//2,0,n-1)
r=quicksort(lists,n//2-1,0,n-1)
mid=(lists[l]+lists[r])//2.0
return mid
else:
mid=quicksort(lists,n//2,0,n-1)
return lists[mid]
def quicksort(self,lists,k,start,end):
l=start
r=end
mid=lists[l]
while l<r:
while l<r and lists[l]<mid:
l+=1
lists[r]=lists[l]
while l<r and lists[r]>mid:
r-=1
lists[l]=lists[r]
a[l]=mid
if k==l:
return l
if k<l:
return self.quicksort(lists,k,start,l-1)
else:
return self.quicksort(lists,k,l+1,end)