2011-10-23 14 views
2

私は、次のしているコードPythonコードの理解

def compare_and_swap(x, a, b): 
    if x[a] > x[b]: 
     x[a], x[b] = x[b], x[a] 

def oddeven_merge(x, lo, hi, r): 
    step = r * 2 
    if step < hi - lo: 
     oddeven_merge(x, lo, hi, step) 
     oddeven_merge(x, lo + r, hi, step) 
     for i in range(lo + r, hi - r, step): 
      compare_and_swap(x, i, i + r) 
    else: 
     compare_and_swap(x, lo, lo + r) 

def oddeven_merge_sort_range(x, lo, hi): 
    """ sort the part of x with indices between lo and hi. 

    Note: endpoints (lo and hi) are included. 
    """ 
    if (hi - lo) >= 1: 
     # if there is more than one element, split the input 
     # down the middle and first sort the first and second 
     # half, followed by merging them. 
     mid = lo + ((hi - lo)/2) 
     oddeven_merge_sort_range(x, lo, mid) 
     oddeven_merge_sort_range(x, mid + 1, hi) 
     oddeven_merge(x, lo, hi, 1) 

def oddeven_merge_sort(x): 
    oddeven_merge_sort_range(x, 0, len(x)-1) 

>>> data = [4, 3, 5, 6, 1, 7, 8] 
>>> oddeven_merge_sort(data) 
>>> data 
[1, 2, 3, 4, 5, 6, 7, 8] 

すべてが私にとっては明らかであるが、これだけの行は理解できない、私はそれが擬似コードを使用していますか?またはで読むことができますどのようにうまく

for i in range(lo + r, hi - r, step): 

他の言語、例えばC++?

答えて

3

Cで

for(int i=lo+r;i<(hi-r);i+=step) 

この同等(またはC++やJava、C#の、など)

(注:stepが正の場合にのみ動作しますステップが負の場合 - すなわちLO + R> HI-R、あなたはi>(hi-r)にチェックを変更する必要があります)

何それがないことは、lo+rでカウンタを開始するカウンタ当量までstep単位で動かしていますまたはhi-r以降の手順を実行します。あなたは、(正のステップのために)以下の擬似コードとしてそれを読むことができ

+2

あなたが持っているものは非常に危険です、永遠にループする可能性があります。私はpythonの範囲と同等だとは思わない。 – Mat

+3

@Mat:True。それは永遠に繰り返すかもしれませんが、私はC言語のようにプラスとマイナス両方のために働く方法を考えることはできません。私は肯定的なケースのためだけに働くように私の答えを更新しています。 – MAK

+0

+1悪いステップについての良い点。 –

0

stepのインクリメントでlo + r(包括的)からhi -r(これを含まない)までのループ。

for (i = lo + r; i < hi - r; i += step) { ... } 

Pythonでそれを書くための別の方法を::

i = lo + r 
while i < hi - r: 
     # loop body 
     i += step 

ステップが負の場合、<になるステップは、それがのように書くことができ、Cのような言語では、肯定的であると仮定すると、

上記コードの>

1

ライン

for i in range(lo + r, hi - r, step): 

stepの段階で、を含まないlo+rからhi-rに実行している私でループためです。 range(start, end, step)に、開始および終了の値はどのような方法で注文することができ、そのステップが正または負できること

>>> for i in range(10, 31, 3): 
...  print i 
...  
10 
13 
16 
19 
22 
25 
28 

注:ここでは一例です。これにより、Cバージョンの作成が少し面倒になります。

あなたがを知っていればこのように、Pythonのfor i in range(lo + r, hi - r, stepは擬似コードです:実際には、

  • それは、テストカウンタの初期化とwhileループよりも間違いなくより簡潔で読みやすいですし、上のインクリメント3つの異なる行。
  • これは、Pythonで扱うすべてのケース(開始と終了の順序、およびステップの符号)をうまく処理します。
0

:負手順について

i = lo + r 
while i < hi - r: 
    # body of loop 
    i = i + step 

た:すなわち

i = lo + r 
while i > hi - r: 
    # body of loop 
    i = i + step 

を、それが最初からi変数を反復処理しましたそれが第2の値に達するかまたはそれを通過するまで、ループを通過する毎に第3の値でそれを調整する。

1

擬似コードを使用して読むにはどうすればよいですか?

Pythonは非常に擬似コードに近いです。指定されたrangeiの各値に次のコードを実行します。

for i in range(lo + r, hi - r, step): 

は、それが言う正確に何を意味しています。最初の2つの値は範囲の下限と上限です。stepは使用する値の間の距離です。詳細については、Pythonインタプリタのプロンプトでhelp(range)を試してください。