我正在實施隨機(jī)快速排序?,F(xiàn)在,我已經(jīng)創(chuàng)建了一個函數(shù)ChoosePivot(A,N)。這將返回隨機(jī)樞軸及其在輸入數(shù)組中的位置。然后,我用數(shù)組中的第一個元素切換該隨機(jī)樞軸,以便樞軸輸入Partition (A,l,r)始終是第一個元素。For NowChoosePivot(A,N)也返回數(shù)組的第一個元素,但我打算稍后對其進(jìn)行修改。以下是我的代碼:def QuickSort(A,N): if (N == 1): return pivot, pivot_pos = ChoosePivot(A,N) l = 0 r = len(A) # Preprocessing, swapping pivot position with first element so that first element remains pivot always temp = A[0] A[0] = A[pivot_pos] A[pivot_pos] = temp A, i= Partition(A,l,r) print A,i # If i-1 == 0 this means that there is no left subarray if (i-1 != 0): print "Unsorted array" print A[0:i-1] QuickSort(A[0:i-1],i-1) print "Left call" print A if (N-i !=0): print "Unsorted array" print A[i:N] QuickSort (A[i:N], N-i) print "Right call" print A以下是我的 Partition(A,l,r)def Partition(A,l,r): # Now first element is the pivot i= l + 1 pivot = A[l] for j in range(l+1, r): if (A[j] < pivot): #swap (A[j], A[i]) temp_1 = A[i] A[i] = A[j] A[j] = temp_1 i = i+1 #swap (A[i-1], A[l]) temp_2 = A[i-1] A[i-1] = A[l] A[l] = temp_2 return A, i ChoosePivot(A,N) 現(xiàn)在只需返回數(shù)組中的第一個元素def ChoosePivot(A, N): #print A return A[0], 0我使用的輸入數(shù)組如下:Test_in = [3,8,2,5,1,4,7,6]print Test_inQuickSort(Test_in, len(Test_in))print Test_in 請注意,我可以看到代碼在遞歸的低端運(yùn)行。我用筆和紙進(jìn)行了空運(yùn)行代碼,通過打印語句可以看到它確實對子數(shù)組進(jìn)行了排序,但是當(dāng)數(shù)組最終返回時,它并沒有改變。我認(rèn)為它與值與引用調(diào)用有關(guān),但是我發(fā)現(xiàn)python是通過引用調(diào)用的。因此,那里應(yīng)該沒有任何問題。還要發(fā)布輸出,并指出錯誤的確切位置。
1 回答

千萬里不及你
TA貢獻(xiàn)1784條經(jīng)驗 獲得超9個贊
我發(fā)現(xiàn)了錯誤。問題是當(dāng)我QuickSort
再次調(diào)用時,我將原始列表切成薄片并將其作為參數(shù)傳遞。切片列表時,python創(chuàng)建一個新列表,并將切片列表復(fù)制到具有相同名稱的新列表中。所有更改都發(fā)生在遞歸內(nèi)的新列表中,因此不會反映到頂部。作為解決方案,我傳遞了整個數(shù)組,并將列表索引作為參數(shù)傳遞給了數(shù)組。
還有另一個錯誤。調(diào)用之前的狀況QuickSort
是i-1!=0
和N-i!=0
不正確的,因為支點可以在陣列中的任何指標(biāo)。我為左右子數(shù)組創(chuàng)建了單獨的左右索引并進(jìn)行了測試left_index < right_index
。
添加回答
舉報
0/150
提交
取消