思路:
基于快排改进
选取arr[0]作为基准值,tmp= arr[0],排序后,返回tmp的下标index
此时,arr[index] 左侧的值都小于tmp, 右侧的值都大于tmp。
如果K==index,那么从起始点0到下标index-1的值就为最小的K个数,
如果K < index,说明K个数在区间[0,index-1]里,重新继续选取基准值进行排序
如果 K > index, 说明还有K-index个数在区间[index+1,-1]里, 再次选取基准值在新区间排序。
def quick(arr,low.high):
tmp = arr[low]
while low < high:
while low < high and arr[high] >= tmp:
high -=1
arr[low] = arr[ high]
while low < high and arr[low] <= tmp:
low +=1
arr [high] = arr[low]
arr[low] = tmp
return low
def Knumber(arr,k):
if k > len(arr) or k <=0 : return []
low = 0
high = len(arr) -1
index = quick(arr,low,high)
while index != k-1 :
if k-1 > index;
low = index + 1
index = quick(arr,low,high)
if k-1 < index :
high = index -1
index = quick(arr,low,high)
return arr[:k]