全体のコード
#!/bin/bash array=(24 63 40 24 44 24 40 92 51 42 2 23 48 51 13 79 54 57 44 76) gap=${#array[@]} flg=1 while ((gap > 1 || flg == 1)); do gap=$((gap * 10 / 13)) if [ $gap -lt 1 ]; then gap=1 fi flg=0 for ((i = 0; $((i + gap)) < ${#array[@]}; i++)); do if [ "${array[$i]}" -gt "${array[$((i + gap))]}" ]; then tmp=${array[i]} array[i]=${array[$((i + gap))]} array["$((i + gap))"]=$tmp flg=1 fi done done echo "${array[@]}"
実行結果
2 13 23 24 24 24 40 40 42 44 44 48 51 51 54 57 63 76 79 92
変数gapが1より大きい、またはソートが完了していない時にwhileループを回します。
gapの収縮率は1.3にしています。
gapの値が1より小さくなったら要素同士を比較することができなくなるので、値を1に固定する必要があります。
while ((gap > 1 || flg == 1)); do gap=$((gap * 10 / 13)) if [ $gap -lt 1 ]; then gap=1 fi done
for文を回して要素の値を交換していきます。
この時の条件は、変数iとgapの値を足した値が配列の要素数未満の時に実行されるようにします。
for ((i = 0; $((i + gap)) < ${#array[@]}; i++)); do done
要素を入れ替える部分が無くなった時、flgに0が代入された状態になりますのでループが終了します。
これで以上となります。