2016-04-03 6 views
1

2番目の数字から始まる配列をソートしようとしています。前の数字が大きいかどうかを調べる前にその配列を探します。そうであれば、番号を交換したい、そうでない場合は番号を入れておきます。現在、私のコードはそれをしません。私が変更した唯一のものの下に配列を入力すると、2が11になり、真ん中に2つの11が与えられます。何がうまくいかないのですか?pythonスワップソートで正しい出力が得られない

#given an array of digits a of length N 
a = [7, 3, 11, 2, 6, 16] 
N = len(a) 

# moving forward along a starting from the second position to the end 

# define _sillysort(a, start_pos): 
#  set position = start_pos 
#  moving backwards along a from start_pos: 
#   if the a[position-1] is greater than a[position]: 
#    swap a[position-1] and a[position] 
def sillysort(a, start_pos): 
    a_sorted = [] 
    start_pos = a[1] 
    for position in a: 
     if a[start_pos-1] >= a[start_pos]: 
      a[start_pos-1], a[start_pos] = a[start_pos], a[start_pos-1] 
     else: 
      a[start_pos-1] = a[start_pos] 
     a_sorted.append(position) 
     position += 1 
    return a_sorted 

私はこれを実行すると、sillysort(N)、私はこの出力を得る[7、3、11、11、6、16]。あなたはすでに、なぜあなたが機能でそれを再初期化している、あなたの関数の引数としてstart_posを提供している場合は

答えて

0

あなたのコードは、問題のカップル

start_pos = a[1]

を持っています。さらに、aが並べ替える配列の場合、アルゴリズムのstart_posは配列aの2番目の要素ですか?

for position in a: 
     if a[start_pos-1] >= a[start_pos]: 
      a[start_pos-1], a[start_pos] = a[start_pos], a[start_pos-1] 
     else: 
      a[start_pos-1] = a[start_pos] 
     a_sorted.append(position) 
     position += 1 

for inループアレイaを反復し、positionは、配列の要素の値を取ります。あなたの例ではpositionは、次の順序での値を取ります:

7, 3, 11, 2, 6, 16

私は、forループの終わりに1で、なぜあなたが位置をインクリメントされている理解していません。もう一度、配列内の値を使用して、インデックス自体ではなく配列にインデックスを付けます。

start_posは値a[1]、つまり3をとるため、コードは[3]とa [2]すなわち2と11を比較し、else条件に入り、[3] = a [2 ]したがって、2の位置に11を取得します

あなたは多分変数名に自分自身を混乱させるでしょう。これがあなたに役立つかどうかを見てください。

関連する問題