シェルスクリプト(Bash)で配列の値をコムソートして昇順に並び替える




全体のコード

#!/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が代入された状態になりますのでループが終了します。




これで以上となります。