簡體   English   中英

嘗試編寫快速排序的就地實現,但在返回排序數組時遇到問題

[英]Trying to write an in-place implementation of quicksort and I'm having trouble returning the sorted array

我嘗試編寫就地快速排序,但無法正確返回排序后的數組。 根據打印語句的輸出,該算法似乎正在對數組進行排序,但我似乎無法返回已排序的數組。 我以為它會就地排序,但似乎不是,我不知道如何糾正這個問題。

def quicksort(array):

    if len(array) <= 1:
        return 

    pivot = len(array) - 1
    i = 0

    while i < pivot:
        if array[i] > array[pivot]:
            if i == pivot - 1:
                array[i], array[pivot] = array[pivot], array[i]
            
            array[pivot], array[pivot-1] = array[pivot-1], array[pivot]
            pivot -= 1
            array[i], array[pivot+1] = array[pivot+1], array[i]
        else:
            i += 1
        
    print(array)
    quicksort(array[:pivot])    # sorts lower
    quicksort(array[pivot:])    # sorts upper

    return array


test = [21, 4, 1, 3, 9, 20, 25, 6, 21, 14]
print quicksort(test)

這里的問題是您正在切片一個list ,它返回一個副本而不是一個視圖 因此,您的每個遞歸調用都會對副本進行排序,而不是對原始列表進行排序。 我建議您使用numpy.array作為輸入來執行就地快速排序。 實際上(基本)切片numpy.array返回一個 view 這是最接近規范數組的python數據結構。

當您進行遞歸調用quicksort(array[:pivot]) ,您不會將原始列表傳遞給quicksort() ,而是創建一個新列表。

為避免創建新列表,您可以刪除切片語法,而是將數組索引傳遞給您的函數:

def quicksort(array, start, length):

    if length <= 1:
        return 

    pivot = start + length - 1
    i = start

    while i < pivot:
        if array[i] > array[pivot]:
            if i == pivot - 1:
                array[i], array[pivot] = array[pivot], array[i]
            
            array[pivot], array[pivot-1] = array[pivot-1], array[pivot]
            pivot -= 1
            array[i], array[pivot+1] = array[pivot+1], array[i]
        else:
            i += 1
        
    print(array[start:start+length])
    quicksort(array, start, pivot-start)    # sorts lower
    quicksort(array, pivot, length-pivot)   # sorts upper

    return array


test = [21, 4, 1, 3, 9, 20, 25, 6, 21, 14]
print quicksort(test, 0, len(test))

暫無
暫無

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

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