2017-09-12 39 views
1

我想在python中實現快速排序。問題是如何在數組a中增加/減少i/j的值。我知道我應該寫i=i+1,在python中沒有像i++這樣的東西,但我不明白我應該怎麼做。 我是新手,這是我的代碼。Python中的QuickSort。在數組中遇到問題

def quicksort(a,lo,hi): 
    if(hi<=lo): 
     return 
    i = lo - 1 
    j = hi 
    v = a[hi] 

    while True: 
     while(a[++i] < v): 
      pass 

     while(v < a[--j]): 
      if(j==lo): 
       break 
     if(i>=j): 
      break 
     t = a[i] 
     a[i] = a[j] 
     a[j] = t 

    t = a[i] 
    a[i] = a[hi] 
    a[hi] = t 
    quicksort(a, lo, i - 1) 
    quicksort(a, i + 1, hi) 

回答

0
在Python

,你不能分配和獲得的價值,這是一個有意的限制,以避免問題的拼寫錯誤,找到正確的順序點......

你沒有選擇,而不是「模仿」的C-移植代碼:

while(a[++i] < v): 
     pass 

    while(v < a[--j]): 
     if(j==lo): 
      break 

(注意,這兩個結構產生無限循環,因爲:

++i == i 

--j == j 

(採用一元外加任意數量的次元負的偶數次給出了相同的號碼,看到Why Don't Two Plus Operators Throw an Error (e.g., 1 + + 2)

所以更改爲:

i += 1 
    while(a[i] < v): 
     i += 1 

    j -= 1 
    while(v < a[j]): 
     if(j==lo): 
      break 
     j -= 1 
+0

謝謝你,我很欣賞你的幫助。 – Ntryhard

0

以下構造在Python中的工作方式與在C++中的工作方式不同:

while(a[++i] < v):

還有這樣一條:

while(v < a[--j]):

的方式更改代碼如下:

def quicksort(a,lo,hi): 
    if(hi<=lo): 
     return 
    i = lo - 1 
    j = hi 
    v = a[hi] 

    while True: 
     i += 1 
     while(a[i] < v): 
      i += 1 
      pass 

     j -= 1 
     while(v < a[j]): 
      j -= 1 
      if(j==lo): 
       break 
     if(i>=j): 
      break 
     t = a[i] 
     a[i] = a[j] 
     a[j] = t 

    t = a[i] 
    a[i] = a[hi] 
    a[hi] = t 
    quicksort(a, lo, i - 1) 
    quicksort(a, i + 1, hi) 
+0

非法?你有沒有試圖讓它運行/編譯它?順便說一句,你的代碼並不等同於OP所要的。 –

+0

編譯?我們在談論Python嗎? – sophros

+0

我的意思是:語法正確。 –