home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
ST_USER
/
1989
/
USER1189.MSA
/
LISTINGS.ARC
/
DEMOQUIK.BSC
< prev
next >
Wrap
Text File
|
1989-09-03
|
6KB
|
238 lines
\ QUICKSORT DEMONSTRATION PROGRAM
\ Written in FAST BASIC
\ By Nigel Belcher
\ Written for ST User June 1988
\ SAMPLE PROGRAM TO DEMONSTRATE THE SORTING MECHANISM USED
IF SCREENMODE=0 THEN stop=ALERT("[3][Cannot be|run in Low|Resolution][OK]",1):END
yes=1
no=0
DIM array(20),sorted(20)
HIDEMOUSE
PROCfullscreen
REPEAT
n=0
comparisons=0
swaps=0
PROCinputnumbers(n)
recursion=0
PROCquicksort(1,n)
PRINTTAB(40,8);"The list is now sorted"
PROCdisplaylist(1,n,n)
PRINTTAB(40,9);"Do you want to watch another sort?";
ok=-1
REPEAT
key$=GET$
IF key$="Y" OR key$="y" THEN another=yes
IF key$="N" OR key$="n" THEN another=no
UNTIL another=yes OR another=no
PRINTTAB(40,9);SPC(40);
PRINTTAB(40,8);SPC(20)
UNTIL another=no
PROCrestorewindows
SHOWMOUSE
END
DEFPROCinputnumbers(VAR n)
LOCAL i,random,key$
CLS
REPEAT
INPUTTAB(0,1);"How many numbers do you want to sort (2 - 20)";n
PRINTTAB(0,1);SPC(159);
UNTIL n>=2 AND n<=20
SHOWMOUSE
random=ALERT("[1][Choice of numbers][Random|Your own]",1)
HIDEMOUSE
IF random=1 THEN
\ Allocate random numbers
FOR i=1 TO n
array(i)=RND(1000)
sorted(i)=no
NEXT
ELSE
\ Get user-input numbers
FOR i=1 TO n
REPEAT
PRINTTAB(0,i);SPC(70);
PRINTTAB(0,i);"Element no.";FORMAT$(i,"ZD");
INPUT array(i)
UNTIL array(i)=INT(array(i)) AND array(i)>=-99999 AND array(i)<=999999
sorted(i)=no
NEXT
ENDIF
ENDPROC
DEFPROCfullscreen
\ Various GEM routines to sort out window sizes
RESERVE windowtitle%,80
{windowtitle%}$="QUICKSORT DEMONSTRATION"
SETWINDTITLE OUTHANDLE,windowtitle%
GETWINDCOORDS OUTHANDLE,oldscreenxbase,oldscreenybase,oldscreenwidth,oldscreenheight
GETWINDFULL OUTHANDLE,fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
SETWINDCOORDS OUTHANDLE,fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
CALCWORK %11111101111,fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
TXTRECT fullscreenxbase,fullscreenybase,fullscreenwidth,fullscreenheight
CLS
IF SCREENMODE=2 THEN normal=13 ELSE large=13:normal=6
TXTSIZE normal
ENDPROC
DEFPROCquicksort(first,last)
\ The quicksort routine
\ NOTE: It has been enhanced only by the need to display lists
\ as the routine works
LOCAL i,j,key
recursion=recursion+1
PROCdisplaylist(first,last,n)
IF first>=last THEN sorted(last)=yes:ENDPROC
\ Initial values of variables
i=first
PROCshowi
j=last+1
PROCshowj
key=array(first)
PRINTTAB(0,first);"key ->";
REPEAT
REPEAT
\ Move i down the list
i=i+1
comparisons=comparisons+1
PROCshowi
PROCdelay
UNTIL array(i)>=key OR i=last
REPEAT
\ Move j up the list
j=j-1
comparisons=comparisons+1
PROCshowj
PROCdelay
UNTIL array(j)<=key OR j=first
IF i<j THEN
\ i and j have stopped but not crossed over
PRINTTAB(40,6);"i and j haven't crossed over"
PRINTTAB(40,7);array(i);" (i) is bigger than ";key
PRINTTAB(40,8);array(j);" (j) is smaller than ";key
PRINTTAB(40,9);"These 2 numbers are swapped"
PROCswapnumbers(i,j)
PRINTTAB(40,6);SPC(38);
PRINTTAB(40,7);SPC(38);
PRINTTAB(40,8);SPC(38);
PRINTTAB(40,9);SPC(38);
ENDIF
UNTIL i>=j
\ i and j have crossed over
PRINTTAB(40,6);"i and j have now crossed"
IF i=j THEN PRINTTAB(40,6);"i and j are now the same"
PRINTTAB(40,7);"j is the correct position for ";key
PRINTTAB(40,8);key;" and ";array(j);" are swapped"
PRINTTAB(40,9);"so that ";key;" is in the right place"
PROCswapnumbers(first,j)
PROCdelay
PRINTTAB(40,6);SPC(38);
PRINTTAB(40,7);SPC(38);
PRINTTAB(40,8);SPC(38);
PRINTTAB(40,9);SPC(38);
sorted(j)=yes
\ Sort first half of list
PROCquicksort(first,j-1)
recursion=recursion-1
\ Sort second half of list
PROCquicksort(j+1,last)
recursion=recursion-1
ENDPROC
DEFPROCdisplaylist(first,last,n)
LOCAL i,key$,t,key
FOR i=1 TO n
\ Faint those not being looked at
IF i<first OR i>last THEN TXTEFFECTS %00000010 ELSE TXTEFFECTS 0
PRINTTAB(0,i);SPC(6);FORMAT$(array(i),"sZZZZZD");
IF sorted(i)=yes THEN PRINT" sorted";SPC(18); ELSE PRINT SPC(24);
NEXT
TXTEFFECTS 0
PRINTTAB(40,11);"Level of recursion ";FORMAT$(recursion,"ZD")
ENDPROC
DEFPROCshowi
PRINTTAB(29,i-1);" ";
PRINTTAB(29,i);"<- i";
PRINTTAB(40,13);FORMAT$(comparisons,"<Comparisons >ZZZZZD")
ENDPROC
DEFPROCshowj
PRINTTAB(33,j+1);" ";
PRINTTAB(33,j);"<- j";
PRINTTAB(40,13);FORMAT$(comparisons,"<Comparisons >ZZZZZD")
ENDPROC
DEFPROCswapnumbers(a,b)
LOCAL x,ya,yb,key,t
IF a=b THEN ENDPROC
swaps=swaps+1
PRINTTAB(40,15);FORMAT$(swaps,"<Swaps >ZZZZZD")
IF a>b THEN SWAP a,b
\ Move numbers out
FOR x=0 TO 15
IF x<=7 THEN PRINTTAB(6+x,a);FORMAT$(array(a),"XsZZZZZD");
PRINTTAB(6+x,b);FORMAT$(array(b),"XsZZZZZD");
PROCdelay
NEXT
ya=a:yb=b
\ Move numbers up/down
REPEAT
PRINTTAB(14,ya);SPC(7);
ya=ya+1
PRINTTAB(14,ya);FORMAT$(array(a),"sZZZZZD");
PROCdelay
PRINTTAB(22,yb);SPC(7);
yb=yb-1
PRINTTAB(22,yb);FORMAT$(array(b),"sZZZZZD");
PROCdelay
UNTIL yb<=a OR ya>=b
SWAP array(a),array(b)
\ Move numbers in
FOR x=15 TO 0 STEP -1
PRINTTAB(6+x,a);FORMAT$(array(a),"sZZZZZDX");
IF x<=7 THEN PRINTTAB(6+x,b);FORMAT$(array(b),"sZZZZZDX");
PROCdelay
NEXT
ENDPROC
DEFPROCdelay
LOCAL t
t=TIME
REPEAT
UNTIL TIME-t>30
ENDPROC
DEFPROCrestorewindows
\ Restore output window to its original size
GETWINDPREV OUTHANDLE,oldscreenxbase,oldscreenybase,oldscreenwidth,oldscreenheight
CLS
GRAB 0,0,oldscreenwidth,oldscreenheight
CLOSEWIND OUTHANDLE
PUT 0,0,3
{windowtitle%}$="Output"
SETWINDTITLE OUTHANDLE,windowtitle%
OPENWIND OUTHANDLE,oldscreenxbase,oldscreenybase,oldscreenwidth,oldscreenheight
ENDPROC