(2016/8/10)
アルゴリズムの定番である「データの並び替え(ソートアルゴリズム)」です。 今回は入力と出力の配列を分けることで、CSアンプラグド風に「1個の配列で処理することにこだわらない」ようにしてみました。
//in=配列!5 3 7 2 8 6 1 4 作る。 in=配列!作る。「in!(乱数(50))書く」!20 繰り返す。 ラベル!(in)作る。 out=配列!作る。 「 min=in!1 読む。pos=1。 「|n| v=in!(n)読む。 「v<min」!なら「min=v。pos=n」実行。 」!(in!要素数?)繰り返す。 out!(min)書く。in!(pos)位置で消す。 」!(in!要素数?)繰り返す。 ラベル!(out)作る 次の行。
//in=配列!5 3 7 2 8 6 1 4 作る。 in=配列!作る。「in!(乱数(50))書く」!20 繰り返す。 ラベル!(in)作る。 out=配列!作る。 「|i| v1=in!(i)読む。 n=0。 「|j| v2=out!(j)読む。 「v1>v2」!なら「n=j」実行。 」!(out!要素数?)繰り返す。 out!(n+1)(v1)挿入。 」!(in!要素数?)繰り返す。 ラベル!(out)作る 次の行。
quick=「|a ; ret n p left right v| ret=a。 n=a!要素数?。 「n>1」!なら「 p=a!(n) 読む。 left=配列!作る。 right=配列!作る。 「|i| v=a!(i)読む。 「v<p」!なら「left!(v)書く」そうでなければ「right!(v)書く」実行。 」!(n-1)繰り返す。 ret=配列!作る(!(left)quick)(p)(!(right)quick)連結。 」実行。 ret。 」。 //in=配列!5 3 7 2 8 6 1 4 作る。 in=配列!作る。「in!(乱数(50))書く」!20 繰り返す。 ラベル!(in)作る。 out=!(in)quick。 ラベル!(out)作る 次の行。