2015-08-29 22 views
0

我知道在Python中,變量是通過給對象的引用副本傳遞的。但我不明白爲什麼在我寫的下面一段代碼中,函數Partition不會更改arr的元素。Python:函數不改變數組中的元素

def Partition(arr, lo, hi): 
    pivot = arr[lo] 
    i = lo 
    j = hi 
    while(True): 
     while(arr[i] < pivot): 
      i += 1 
      if i == hi: break 
     while(arr[j] > pivot): 
      j -= 1 
      if j == lo: break 

     if i >= j : break  #check if ptrs cross 

     arr[i], arr[j] = arr[j], arr[i] 
    #swap lo and j 
    arr[lo], arr[j] = arr[j], arr[lo] 
    return j 

def Sort(arr, start, end): 
    if (end <= start): return 
    right = Partition(arr, start, end) 
    Sort(arr, start, right-1) 
    Sort(arr, right+1, end) 

回答

0

Partition功能有一個邏輯問題。 如果您使用調試器進行跟蹤,您將看到它總是在返回之前將該陣列恢復到其初始狀態。該數組實際上會被視爲已修改,問題在於在擺弄它一段時間之後,它會回到它進入函數時的樣子。

您是否使用調試工具?如果沒有,現在開始這樣做。 如果是這樣,請在return j語句中放置一個斷點,然後檢查該數組,您將明白我的意思。

您正在嘗試執行Hoare分區,對吧? 我覺得你有點混淆起來。這個問題是因爲你在第一次循環迭代之前與主軸進行比較,你最終會比較你剛剛交換的元素。

+0

感謝您的幫助! –

0

這似乎是一個錯誤:

Assume arr = [1,3,4,7,5,8], lo=3, hi=6 
def Partition(arr, lo, hi): 
    pivot = arr[lo] <- this is arr[3] = 7 
    i = lo   <- i = 3 
    j = hi 
    while(True): 
     while(arr[i] < pivot): <- arr[3] = 7 so condition fails hence no swap