我試圖執行this video中討論的算法,並且還在this document中。使用快速排序(Python)查找第k個最小項目
我的快速排序的代碼,這取決於拾取中間元件陣列在作爲樞軸(見下文),而不是由上面的文檔的作者,它使用第一元件在使用的方法作爲shown here in the video的數據集。
顯然,我的代碼不起作用(最終用完了遞歸限制)。我想知道是否是因爲我的代碼中存在一些愚蠢的錯誤,或者只要我從中間選擇中心點,它就無法工作。
def partition(a, start, end):
# I pick the pivot as the middle item in the array
# but the algorithm shown in the video seems to
# pick the first element in the array as pivot
piv = (start + end) // 2
pivotVal = a[piv]
left = start
right = end
while left <= right:
while a[left] < pivotVal:
left += 1
while a[right] > pivotVal:
right -= 1
if left <= right:
temp = a[left]
a[left] = a[right]
a[right] = temp
left += 1
right -= 1
return left
def quicksort(a, start, end, k):
if start < end:
piv = partition(a, start, end)
if piv == (k - 1):
print("Found kth smallest: " + piv)
return a[piv]
elif piv > (k - 1):
return quicksort(a, start, piv, k)
else:
return quicksort(a, piv + 1, end, k)
myList = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quicksort(myList, 0, len(myList) - 1, 3)
print(myList)
您是否檢查過quickselect算法? –
您正在使用包含數組邊界。你正在做這個不必要的努力。幾乎所有算法都使用[start,end)更加優雅地描述。 – orlp
您在'partition'功能中混合使用'a'和'arr'。 – thefourtheye