私はあなたのために何ができるか見てみましょう。参照用のコード:
def my_sort(array):
length_of_array = range(1, len(array))
for i in length_of_array:
value = array[i]
last_value = array[i-1]
if value<last_value:
array[i]=last_value
array[i-1]=value
my_sort(array)
return array
def my_sort(array):
引数として配列を取る関数。
length_of_array = range(1, len(array))
の項目数に基づいて、反復可能な数値
の に変数を設定しlength_of_array
ます。何が何をするのか知っていると思いますが、そうでない場合は、要するに、リストを反復処理するのと同じ方法で反復処理できます。(ここでも使えます。)range
array
range
xrange()
for i in length_of_array:
value = array[i]
last_value = array[-1]
ここで行っているのは、 を使用しrange
て間接的に配列をトラバースすることです。これは、それぞれの項目の合計が同じであるためです。しかし、よく見ると、は 1 から始まるインデックスとして をvalue
使用しているため、実際には array[1] であり、orです 。i
value
last_value
array[1-1]
array[0]
if value<last_value:
array[i]=last_value
array[i-1]=value
ですから、値を比較しています。を渡したとしましょう[3, 1, 3, 2, 6, 4]
。ループの最初の反復にいるので、基本的にarray[1]
は、1 である が 3 である より小さい場合array[0]
、それらを交換します。もちろん、1 は 3 より小さいので、交換します。ただし、コードは各項目を前の項目と比較することしかできないため、array
最低から最高の順に正しく並べ替えられるという保証はありません。後続のアイテムが大きい場合、各反復は適切にスワップされたアイテムのスワップを解除する可能性があります (たとえば、[2,5,6,4] は最初の 2 つの反復で同じままになります。if
テストではスキップされますが、 3 番目に当たると、6 は 4 と入れ替わりますが、これはまだ間違っています)。実際、これをmy_sort(array)
直下の呼び出しなしで終わらせるとしたら、array
[1, 3, 2, 3, 4, 6]
. 正しくありません。
my_sort(array)
したがって、my_sort()
再帰的に呼び出します。私たちが基本的に言っていることは、最初の反復で何かが間違っている場合は、それを修正してから、新しいものarray
を に戻すということmy_sort()
です。これは最初は奇妙に聞こえますが、うまくいきます。テストがまったく満たされない場合if
、それは元のリストの各項目が次の項目よりも小さかったことを意味します。これは、最初から昇順で並べ替えられていたことを示す別の方法 (実際にはコンピューターの方法) です。それが鍵です。したがって、いずれかのリスト項目が前の項目よりも小さい場合、1 インデックス左に移動します。しかし、それが正しいかどうかはわかりません。おそらく、さらに先に進む必要があります。そのため、最初に戻って (つまり、my_sort()
再び新しく作成されたリストに追加されます)、もう一度左に引っ張る必要があるかどうかを再確認します。それができない場合if
、次のエラーが発生するまで、テストは失敗します (各項目は次の項目よりも小さくなります)。反復ごとに、これは正しい位置に来るまで、同じ小さい数値を 1 つのインデックスだけ左に動かします。これは実際よりもややこしく聞こえるので、各反復の出力を見てみましょう。
[3, 1, 3, 2, 6, 4]
[1, 3, 3, 2, 6, 4]
[1, 3, 2, 3, 6, 4]
[1, 2, 3, 3, 6, 4]
[1, 2, 3, 3, 4, 6]
何が起こっているか見てますか?各反復で何が変化しているかだけを見るとどうなるでしょうか。
[3, 1, ... # Wrong; swap. Further work ceases; recur (return to beginning with a fresh call to my_sort()).
[1, 3, 3, 2, ... # Wrong; swap. Further work ceases; recur
[1, 3, 2, ... # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 6, 4 # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 4, 6] # All numbers all smaller than following number; correct.
これにより、関数は、後ろから前に数値をプルするのに必要な回数だけ自分自身を呼び出すことができます。繰り返しになりますが、呼び出されるたびに、最初の間違ったインスタンスに焦点を当て、適切な位置に配置されるまで 1 つ左に引っ張ります。それが役立つことを願っています! 問題が解決しない場合はお知らせください。