簡體   English   中英

在嘗試使用Python快速排序算法時,在實現遞歸時遇到問題

[英]Having issues implementing recursion in my attempt at a quick sort algorithm in Python

我試圖用Python編寫自己的快速排序算法,而不用專業地研究它的完成方式(我將通過這種方式學到更多)。 如果我對如何實現這種快速排序的想法對您來說很愚蠢,(我知道它可能會做到),請不要給我一種完全不同的方法,除非我的方法永遠不會成功或至少不會成功沒有荒唐的措施,請幫助我以所需的方法達成解決方案:)

當前,我定義了一個函數“ pivot”,它將接收輸入列表並輸出三個列表,一個小於該樞軸的數字列表(在這種情況下,每次選擇為列表中的第一個數字),一個數字列表等於樞軸,並且列表大於樞軸。

我的下一步是定義一個函數“ q_sort”。 首先,此函數創建一個名為“ finalList”的列表,並用0填充它,使其長度與要排序的列表相同。 接下來,它旋轉列表,並將等於該樞軸的數字添加到已經位於其正確位置的finalList上(因為有0表示小於它的項目數,還有0代替占位符。大於樞軸的項目)

這一切都很好。

下一步是行不通的。 我已經在下面一些經過深思熟慮的偽代碼中寫了下一步要發生的事情:

numList = [3, 5, 3, 1, 12, 65, 2, 11, 32]

def pivot(aList):
    biggerNum =[]
    smallerNum = []
    equalNum = [aList[0]]
    for x in range(1, len(aList)):
        if aList[0]<aList[x]:
            biggerNum.append(aList[x])
        elif aList[0]>aList[x]:
            smallerNum.append(aList[x])
        elif aList[0] == aList[x]:
            equalNum.append(aList[x])
    pivoted = [smallerNum, equalNum, biggerNum]
    return pivoted

def q_sort(aList):
    finalList = []
    for x in range(len(aList)):
        finalList.append(0)
    pivot(aList)
    for i in range(len(pivot(aList)[1])):
        finalList[len(pivot(aList)[0])+i] = pivot(aList)[1][i]

偽代碼:

    #if len(smallerNum) != 0:
        #q_sort(smallerNum) <--- I want this to add it's pivot to finalList
    #if len(biggerNum) != 0:
        #q_sort(biggerNum) <--- Again I want this to add it's pivot to finalList
#return finalList <--- Now after all the recursion every number has been pivoted and added

我打算發生的是,如果小於樞軸的數字列表中確實包含任何項目,則它將對該列表進行q_sort。 這意味着它將找到一個新的樞軸並將其值添加到finalList中的正確位置。 我認為它起作用的方式是,只有將“ numList”中的每個數字都放在正確的位置后,該函數才能到達“ return finalList”。 由於在q_sort中包含q_sort的遞歸性質意味着在樞轉“ smallerNum”(並將樞紐添加到finalList)之后,它將具有另一個樞紐。

問題是您要從每個呼叫開始:使用整個列表,從兩端開始。 您需要在列表的每個分區上重復:樞軸下方的部分,然后是樞軸上方的部分。 通常通過傳遞子列表的端點來完成此操作,例如...

def q_sort(aList, low, high):
    if low >= high:
        return

    # find pivot position, "pivot"
    ...
    # arrange list on either side of pivot
    ...
    # recur on each part of list. 
    q_sort(alist, low_index, pivot-1)
    q_sort(alist, pivot+1, high_index)

輪廓足以讓您動起來嗎?

如果沒有,請嘗試在瀏覽器上搜索“ Python quicksort”,您會發現很多幫助,這些幫助比我們在此介紹的內容更為詳盡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM