「並び替え」がつくるあみだくじ 山中和義 2007/11/07 14:03:04
「並び替え」がつくるあみだくじ |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/11/07 14:03:04 | |
ソート(並べ替え、整列)過程を視覚化することで実現できる。
特に、隣接要素の交換の場合があみだくじになる。 隣接しない場合は、縦線をまたぐあみだくじと考えればよい。 参照 SAMPLEフォルダ内AMIDA3.BAS また、「置換は(隣接する/しない)互換の積で表される」の補足としてのプログラムでもある。 !「並び替え」がつくるあみだくじ LET N=10 !本数 DIM A(N) !対象データ(あみだくじの結果) !DATA 5,2,4,1,3 DATA 9,1,6,10,2,7,8,3,4,5 MAT READ A SUB ConnectLine(b1,b2) !b1とb2との間に横棒を描く LET dy=y/INT(SQR(N))+1 !間隔 PLOT LINES: b1,dy; b2,dy !結線 DRAW disk WITH SCALE(0.05)*SHIFT(b1,dy) !端 DRAW disk WITH SCALE(0.05)*SHIFT(b2,dy) LET y=y+1 !次へ END SUB SET WINDOW 0,N+1,0,N+1 !表示領域 FOR i=1 TO N !番号、縦棒を表示する PLOT TEXT, AT i,N: STR$(i) PLOT LINES: i,1; i,N NEXT i LET y=1 !横棒 ※本数に制限あり。間隔を詰めれば可能。 CALL Sort(A) !CALL Sort2(A) !CALL Sort3(A) !CALL Sort4(A) !CALL Sort5(A,1,UBOUND(A)) MAT PRINT A !隣接する要素の交換 SUB Sort(A()) !基本交換法、隣接交換法、バブルソート FOR i=1 TO UBOUND(A)-1 FOR j=UBOUND(A) TO i+1 STEP -1 IF A(j)<A(j-1) THEN swap A(j),A(j-1) CALL ConnectLine(j-1,j) !横棒を描く END IF NEXT j NEXT i END SUB SUB Sort2(A()) !基本挿入法 ※Tutorialフォルダ内ex44.bas参照 FOR i=2 TO UBOUND(A) FOR j=i TO 2 STEP -1 IF A(j)<A(j-1) THEN swap A(j),A(j-1) CALL ConnectLine(j-1,j) ELSE EXIT FOR END IF NEXT j NEXT i END SUB SUB Sort3(A()) !シェーカーソート LET L=1 LET R=UBOUND(A) DO WHILE L<R FOR i=L TO R-1 IF A(i)>A(i+1) THEN swap A(i),A(i+1) LET SHIFT=i CALL ConnectLine(i,i+1) END IF NEXT i LET R=SHIFT FOR i=R TO L+1 STEP -1 IF A(i)<A(i-1) THEN swap A(i),A(i-1) LET SHIFT=i CALL ConnectLine(i-1,i) END IF NEXT i LET L=SHIFT LOOP END SUB |
└つづき 山中和義 2007/11/07 14:03:37