2016-07-14 12 views
1

私はPythonの初心者で、言語の挿入ソートを実装しようとしています。しかし、ソートするリストに自分のコードを入力すると、同じリストが返されます。私は、コードが2番目のループにも行かないことを知りました。私はPython 3を使用しています。これを逆に反復すると何が問題になりますか?Python3の挿入ソートの逆順の反復処理がありません

def ins_sort(us_in): 
    tmp = None 
    for key in range(1, len(us_in)-1): 
    for i in range(key, 0, -1): 
     if us_in[key] < us_in[i] and key != 0: 
     tmp = us_in[key] 
     us_in[key] = us_in[i] 
     us_in[i] = tmp 
    return us_in 

print(ins_sort([5,2,4,6,1,3])) 

結果:

[5,2,4,1,6,3] 
+0

インデントを修正した後、print文を2番目のループに入れ、期待通りに実行しました(固定インデントで質問を更新しました)。イテレータに問題はありません。 –

答えて

1

あなたは今、あなたのコード内の2つの問題を抱えています。 ;あなたはそれを把握することができない場合は、黄色の上にマウス)

一つは、コードのこの部分である:

for key in range(1, len(us_in)-1): 

は、あなたはあなたが届くfor key in range(1, len(us_in)):をしたいですリストのすべての要素

、他方はこのブロックである:

if us_in[key] < us_in[i] and key != 0: 
    tmp = us_in[key] 
    us_in[key] = us_in[i] 
    us_in[i] = tmp 

反復しているとき、keyはあなたが通過しているのと同じままです。固定されたままではなく、iで動くようにしてください。 iのすべての数字をi-1に置き換え、keyをすべてiに置き換えて修正することができます。

0

ヒント:どこにでも「印刷物」を置くと、変数の状態に従うのに役立ちます。

しかし、「if」ステートメントの外側にtmp変数を入れてみてください。 そして後方実行するために、これを試してください:あなたはあなたの答えを得たよう

for i in range(end): 
     backwards = end - i 
    #do something using "backwards" instead of "i" 

が見える、とにかく私はこれを削除されませんので、あなたは、先端を保つことができるあなたはbegginerだとして、印刷はあなたの親友になります。私を信じて。

+0

彼の後方への走り方はうまくいきます。私は何が間違っているかを考え出した。好奇心があれば私の答えを見てください:) – Brian

+0

あなたは正しいです、あなたの答えを試して、それは完璧に働いています、なぜ彼のコードが安定した "キー"変数で動作しないのかについて、 –

+0

もしあなたがそれについて考えるならば、 'key'が同じままであれば、' i'が減少するので 'key'で' i'を入れ替えたままにしておきます。これはあなたが挿入したいものではありません。挿入ソートでは、2つのうち1つを実行できます。 a)終わりに達するまで、要素をリストの下にスワップするか、または要素が収まる最も早い場所にスワップします。 OPは彼がやっているように見えましたが、少し挑戦しました – Brian

0

編集する必要がある行は主に2行あります。 !それは -1(us_in)lenはない(us_in)lenをする必要があり、if文で、それは I> = 0 代わりの キー= 0 でなければなりません 3行目は、また、第二のループは、キーから後方に開始する必要があります - 1 {反復回数が1回}

+0

これは動作しません。実行してみてください。OPのコードがうまくいかない理由を混乱させるなら、私の解決策を見てください:) – Brian

+0

はい私はこれがうまくいかないことに同意します。あなたの解決策は正しいです。 – badiya