2017-09-12 18 views
1

私はpythonでquicksortを実装しようとしています。問題は、配列aのi/jの値を増減する方法です。私はi=i+1と書くべきであることを知っており、i++のようなものはありませんが、私はこれをどうすればいいのか分かりません。 私は初心者です、ここに私のコードです。 Pythonで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

、あなたは割り当て、取得した値を、それはタイプミスの問題を回避するための意図的な制限だ、適切な順序のポイントを見つけることができない...

あなたは「エミュレート」するよりも、選択肢がありません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

次のC++と同じようにPythonでは同じように動作しません。

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

だけでなく、この1:

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

私は意味:構文的に正しい。 –