LoginSignup
1
0

More than 1 year has passed since last update.

IchigoJam でソートの可視化をしてみた。
今回はバブルソートクイックソートでの昇順ソートを扱う。

※IchigoJamはjig.jpの登録商標です。

バブルソート

今回行うバブルソートは、以下のアルゴリズムである。

  1. ソートする配列全体を対象とする。
  2. 対象の前から順に、隣り合う要素の大小関係をチェックし、前の要素の方が大きい場合は入れ替える。
  3. 対象の最後の組までチェックしたら、対象の一番最後の要素を対象から外し、2から繰り返す。対象が無くなった場合は終了する。

以下が、今回作成したこれを行うプログラムである。

10 ' イチゴ ソート (バブル)
20 FOR I=0 TO 19:[I]=I+1:NEXT
30 FOR I=0 TO 19:P=RND(20-I):T=[I]:[I]=[I+P]:[I+P]=T:NEXT
40 CLS:FOR P=0 TO 19:GOSUB 50:NEXT:GOTO 80
50 FOR K=0 TO 19:LOCATE 6+P,K
60 IF [P]>=20-K ?CHR$(#FF); ELSE ?CHR$(0);
70 NEXT:RETURN
80 FOR I=18 TO 0 STEP -1
90 LOCATE 6,20:?CHR$(#E2);:FOR J=0 TO I
100 LOCATE 7+J,20:?CHR$(#E2);
110 WAIT 5
120 IF [J]<=[J+1] GOTO 140
130 T=[J]:[J]=[J+1]:[J+1]=T:P=J:GOSUB 50:P=J+1:GOSUB 50
140 LOCATE 6+J,20:?CHR$(0);
150 NEXT:LOCATE 7+I,20:?CHR$(0);
160 NEXT
170 LOCATE 0,21:END

クイックソート

今回行うクイックソートは、以下のアルゴリズムである。

  1. ソートする配列全体を対象とする。
  2. 対象に要素が1個しか無い場合、この対象についての処理を終える。
  3. 対象の一番左の要素を基準とし、左位置を対象の左から2番目の位置に、右位置を対象の最後の位置とする。
  4. 左位置が右位置よりも左にあり、かつ左位置の要素が基準以下の間、左位置を右に進める。
  5. 右位置が左位置よりも右にあり、かつ右位置の要素が基準以上の間、右位置を左に進める。
  6. 左位置が右位置よりも左にあるならば、左位置の要素と右位置の要素を交換し、4に戻る。
  7. 左位置(=右位置)の要素が基準より小さいならば、基準の要素と左位置の要素を交換する。
    (これにより、対象の最初から左位置までの部分は基準以下の要素のみ、左位置から最後までの部分は基準以上の要素のみになる)
  8. 「対象の最初から左位置の1個左の部分」「対象の左位置から最後の部分」それぞれを新しい対象とし、2以降の処理を行う。

以下が、今回作成したこれを行うプログラムである。

10 ' イチゴ ソート (クイック)
20 FOR I=0 TO 19:[I]=I+1:NEXT
30 FOR I=0 TO 19:P=RND(20-I):T=[I]:[I]=[I+P]:[I+P]=T:NEXT
40 CLS:FOR P=0 TO 19:GOSUB 50:NEXT:GOTO 90
50 FOR K=0 TO 19:LOCATE 6+P,K
60 IF [P]>=20-K ?CHR$(#FF); ELSE ?CHR$(0);
70 NEXT:RETURN
80 WAIT 5:RETURN
90 S=20:LET[S],0,19
100 IF S<20 GOTO 240
110 X=[S]:Y=[S+1]:S=S-2:IF X<Y LOCATE 6+X,20:?CHR$(#E5); ELSE GOTO 100
120 L=X+1:R=Y:LOCATE 6+L,20:?CHR$(#E2);:LOCATE 6+R,20:?CHR$(#E2);
130 IF L>=R OR [L]>[X] GOTO 150
140 LOCATE 6+L,20:?CHR$(0,#E2);:L=L+1:GOSUB 80:GOTO 130
150 IF R<=L OR [R]<[X] GOTO 170
160 R=R-1:LOCATE 6+R,20:?CHR$(#E2,0);:GOSUB 80:GOTO 150
170 IF R<=L GOTO 200
180 T=[L]:[L]=[R]:[R]=T:P=L:GOSUB 50:P=R:GOSUB 50
190 GOSUB 80:GOTO 130
200 IF [X]>[L] T=[X]:[X]=[L]:[L]=T:P=X:GOSUB 50:P=L:GOSUB 50:GOSUB 80
210 LOCATE 6+X,20:?CHR$(0);:LOCATE 6+L,20:?CHR$(0);
220 S=S+4:IF L-X>Y-L+1 LET[S-2],X,L-1,L,Y ELSE LET[S-2],L,Y,X,L-1
230 GOTO 100
240 LOCATE 0,21:END

実行結果

以下は、これらのプログラムを GIGA IchigoDake で実行した様子である。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0