[英]k-smallest values in array in a sorted order
給定大小為n
的數組,問題是按排序順序返回前k
最小元素。 我的想法是更新QuickSort算法,首先找到第一個k
元素然后再遞歸更新問題以找到k-1
最大元素。 找不到我的錯誤。
def partition(a, left, right):
pivot = a[left]
p = left
q = right
while(p < q):
while(a[q] > pivot and p < q):
q-=1
while(a[p] <= pivot and p < q):
p+=1
a[p] , a[q] = a[q] , a[p]
a[left],a[p]=a[p],a[left]
return p
def kthSmallest(a, left, right, k,c=0):
if left>=right:
return a[c:]
else:
curr = partition(a, left, right)
if curr - left == k - 1:
return kthSmallest(a, left,curr-left-1,k-1,c+1)
if(curr - left > k - 1):
return kthSmallest(a, left, curr-1, k,c)
return kthSmallest(a, curr+1, right, k - (curr - left + 1),c)
temp=[8,5,2,1,6,7,4,9,0]
print(kthSmallest(a,0,len(temp)-1,2))
你的遞歸對我來說並沒有多大意義。 你應該主要想要遵循quicksort的常規算法,你可以避免排序你不關心的數組部分(保證超過k的值)。
這是我怎么做的。 您總是在左側分區上遞歸,如果樞軸索引curr
小於k
,則遞歸到右側分區。 如果curr
更大,您可以跳過第二次遞歸,因為我們不需要任何這些值。 我正在將切片拆分為非遞歸函數,因此我們不需要在每次遞歸調用時都這樣做。
def partial_sort(a, left, right, k):
if left >= right: # base case, do nothing
return
curr = partition(a, left, right)
partial_sort(a, left, curr-1) # always recurse on the left partition
if curr < k: # we only sometimes need to recurse twice
partial_sort(a, curr+1, right)
def kthSmallest(a, k):
partial_sort(a, 0, len(a)-1, k)
return a[:k]
我還要注意,有一種稍微更有效的算法來解決這個精確的計算,並且它在Python標准庫中有一個實現。 heapq.nsmallest
函數使用二進制最大堆來非常優雅地解決這個問題。 我強烈建議您查看它 !
如果我的問題得到解決,你可以使用:
min_k_values = np.sort(x, axis = None)[:k]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.