本の次のスクリプトを理解するには、いくつかの問題があります。
values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
numvalues=${#values[@]}
for (( i=0; i < numvalues; i++ )); do
lowest=$i
for (( j=i; j < numvalues; j++ )); do
if [ ${values[j]} -le ${values[$lowest]} ]; then
lowest=$j
fi
done
temp=${values[i]}
values[i]=${values[lowest]}
values[lowest]=$temp
done
for (( i=0; i < numvalues; i++ )); do
echo -ne "${values[$i]}\t"
done
echo
スクリプトは配列内の数値に対して選択ソートを実行し、最後に正しい数値順にソートします。本によると:
外部i forループは、配列全体を繰り返し、現在の「ヘッド」(交換する必要がある値を入力する場所)を指すために使用されます。 low変数はこのインデックスに設定されます。
この部分を理解しています。最初の反復の最も低い値は、インデックス0、値39になりそうです。
内部jループの仕組みを理解するのに問題があります。その本はこう言います。
残りの要素を最も低い値と比較します。値が最も低い値より小さい場合は、その要素のインデックスを設定します。
j
の値がの値とどのように異なるかはわかりませんi
。私の考えでは、j=i
最初の反復でゼロの場合、この値もj
ゼロに等しくなります。私はこれが2回目以降の反復で変更されるべきだと思います。スクリプト部分が計算する値なので、値がj
値と異なる必要があることを知っています。i
[ ${values[j]} -le ${values[$lowest]} ]
これは内部forループの後続部分のために機能しますかj=i
?j++
If j=i
、そして2回目の繰り返しでは、ifは2に等しいというi=1
意味ですか?j++
新しいコメント:
このスクリプトについてさらに考えてください。内部ループでj = i + 1がどのように機能するかを見ることができます。最初の反復では、iが0でjが1なので、最初の要素と2番目の要素の値を比較します。追加の繰り返しでは、i = 1、j = 2、i = 2、j = 3など...
しかし、私が書いたスクリプトでは、それがどのように機能するのかよく理解していません。最初の反復では、i = 0、j = 0です。したがって、配列の最初の値は自分と比較されます。もちろん、2番目の反復ではi = 1、j = 2なので、2番目と3番目の値を比較します。インデックス0がインデックス1とどのように比較されるかわかりません。 5と比較すると39です。もちろん、2回目の反復では5を36と比較するので、これをスキップします。
ベストアンサー1
私の考えでは、最初の反復でj = iが0の場合、jも0と同じです。
正しく、内部ループのすべての最初の反復についてはj
と同じですi
。
私はこれが2回目以降の反復で変更されるべきだと思います。
また正確です(内部ループの場合)。内側ループの最初の反復には、j
外側ループの反復に保持されているすべての値が含まれます。i
スクリプト部分が計算する値なので、値が
j
値と異なる必要があることを知っています。i
[ ${values[j]} -le ${values[$lowest]} ]
(内部ループの)2回目の繰り返しから始まります。
If
j=i
、そして2回目の繰り返しでは、ifは2に等しいというi=1
意味ですか?j++
これは内部ループ1の2回目の繰り返しでも同様です。
これで、内部ループの最初の繰り返しごとに、i
とj
はlowest
同じです。なぜ?lowest
はすでに設定されていますi
。繰り返し開始時に設定すると、後続のj
テストはに設定されます。つまり、同じ要素を比較するからです。したがって、この内部ループの最初の繰り返しは意味がなく、問題なく開始されます。しかし、これは間違いではなく、単に不要です。i
lowest
j
i
i+1
技術的には1は2ではありませんj++
。なぜなら、変数の後にaが呼び出されるからです。1
++
ポスト増分式に変数を評価した後に値を追加する演算子です。j
2になります後ろに式が評価されました。