我是Python新手,這是我寫的快速排序代碼:
我是Python新手,這是我寫的快速排序代碼。
def Quick(List) 。
if len(List) <= 1:
return List: return
pivot = List[0]
l_idx = 0]
r_idx = len(List)- 1)
while l_idx != r_idx:
while List[l_idx] < pivot and l_idx < r_idx:
l_idx =1
while List[r_idx] > pivot and l_idx < r_idx:
r_idx -= 1; r_idx.
if l_idx < r_idx:
List[l_idx], List[r_idx] = List[r_idx], List< l_idx
List = Quick(List[0: (l_idx)]) [List[l_idx]] Quick(List[(l_idx 1) :])
回傳 List
我想排序的串列是[598, 862, 950, 953, 373, 981, 201, 258, 427, 669]。
如果我運行以下代碼,我會得到
xxx = [598, 862, 950, 953。373, 981, 201, 258, 427, 669]
print(xxx)
# Gives me: [598, 862, 950, 953, 373, 981, 201, 258, 427, 669]/span>
print(Quick(xxx))
# Gives me: [201, 258, 373, 427, 598, 669, 862, 950, 953, 981], which is the correct result.
print(xxx)
# Gives me: [427, 258, 201, 373, 598, 981, 953, 950, 862, 669],這并不是正確的結果。
我想知道為什么我第二次列印串列 "xxx "時得到的結果與我回傳的結果完全不同。謝謝!!
uj5u.com熱心網友回復:
在進入解決方案之前,讓我們先談談發生了什么。第三次列印輸出是你的演算法第一次迭代后的串列,這是為什么?當你做List = something時,你只改變了你的變數所指向的串列,而不是串列本身。這意味著List不再指代作為引數傳遞的串列。你基本上可以把這句話改成一個逐個元素的復制,就像這樣:
span class="hljs-keyword">for index, elem in enumerate(Quick(List[0: (l_idx)]) [List[l_idx]] Quick(List[(l_idx 1):] )。
List[index] = elem
另一件需要記住的事情是,當你使用List[:]陳述句時,你正在創建一個新的串列,發生在這個片斷的修改不會影響原始串列。所以在遞回呼叫中發生的任何變化都將被原始串列所忽略。
我已經修改了你的方法,使它在每一步都對原始串列起作用,為此我們需要兩個額外的引數,即當前迭代的起始索引和結束索引,模擬你的List[:]。我們開始吧。
def BQuick(List, _from, _to)。)
if _to - _from <= 0:
return List: List.
pivot = List[_from]
l_idx = _from ]
r_idx = _to
while l_idx != r_idx:
while List[l_idx] < pivot and l_idx < r_idx:
l_idx =1
while List[r_idx] > pivot and l_idx < r_idx:
r_idx -= 1; r_idx.
if l_idx < r_idx:
List[l_idx], List[r_idx] = List[r_idx], List< l_idx
BQuick(List, _from, l_idx - 1)
BQuick(List, l_idx 1, _to)
return List.
def Quick(List) 。
return BQuick(List, 0, len(List) - 1)
因為我們在原始串列上做了所有的操作,所以不需要在最后賦值來回傳。
uj5u.com熱心網友回復:
原因是你在函式中給List(輸入變數)分配了一個新值。因此,這個變數的范圍是在函式內,你不能在函式外看到List的變化(更多細節見這篇文章)。
然而,正如在評論中提到的,你可以將結果分配到xxx中,當通過xxx = Quick(xxx)回傳時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/308816.html
標籤:
