输出最小的k个数
方法一:排序
对原数组从小到大排序后取出前k个数即可。直接调用sort函数
def smallestK(a,k):
a.sort()
return a[:k]
方法二:堆
用一个大根堆实时维护数组的前k小值。首先将k个数插入大根堆中,随后从第k+1个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,就把堆顶的数弹出,再插入到当前遍历到的数。最后将大根堆里的数存入数组返回即可。
利用python中的heapq模块。heapify只能维护一个小堆根,故要取负数。
def smallestK(a,k):
if k==0:
return list
hp=[-x for x in a[:k]]
heapq.heapify(hp)
for i in range(k,len(a)):
if -hp[0]>a[i]:
heapq.heappop(hp)
heapq.heappush(hp,-a[i])
return [-x for x in hp]
方法三:快排
快排结束,进行数据划分,假设这个数属于第t个
t==k,那么返回前t个;
t > k,那么问题规模缩小为在前面t-1个数找k个;
t < k,说明已经确定前t个数属于前k个,但是第t+1到k这些数还没确定,那么问题规模缩小为从t+1到右边界找k-t个数
def QuickSort(arr,l,r,k):
i,j=l,r
if l>=r or k==0:return arr
while i<j:
while i<j and arr[j]>=arr[l]:j-=1
while i<j and arr[i]<=arr[l]:i+=1
arr[i],arr[j]=arr[j],arr[i]
arr[l],arr[i]=arr[i],arr[l]
if k==i:return arr[:i]
elif k<i:QuickSort(arr,0,i-1,k)
else:
QuickSort(arr,i+1,r,k)
return arr[:k]