home *** CD-ROM | disk | FTP | other *** search
/ Old Hackers Atari User Group Newsletter / Old_Hackers_Atari_User_Group_Newsletter_OHJFM00B.atr / dsorting.txt < prev    next >
Text File  |  2023-02-26  |  13KB  |  1 lines

  1.             SORTING NUMBERS¢            ===============¢¢             by Ron Fetzer¢¢            The Bubble Sort¢¢      We   will  use  a  bubble  sort¢ because   it   is   the   easiest  to¢ understand. We first load the numbers¢ into  a  number array. In this sort 2¢ elements of the  array  are  examined¢ during  each  pass of the loops. They¢ are switched if they are not  in  the¢ right  order  -  low to high. If they¢ are in the right order the loop keeps¢ on  going.  A bubble sort is slow but¢ it is fine if you don't have too many¢ numbers.¢¢      This sort uses nested loops. The¢ outer loop is the same as the  number¢ of  elements  of the array. The inner¢ loop is ONE LESS than the elements of¢ the  array.  The  switching  is  done¢ between these 2 loops. In our program¢ it is lines # 140 to 170.¢¢      Lets enter these 4 numbers  into¢ the  bubble sort and see how they are¢ processed.  The numbers are:  3,2,7,1¢ Between  the  outer  loop(4)  and the¢ inner loop(3)  we  have  (4x3=12)  12¢ passes  of the loops. The bubble sort¢ arranges the 2 elements from  low  to¢ high.  If these 2 elements are out of¢ order, it switches  them.  The  array¢ starts out as: 3,2,1,7¢¢ PASS NUMBERS  ACTION  ELEMENT ORDER¢ ---- -------  ------  -------------¢¢ 1  [3,2],7,1  SWITCH 2,3  2,3,7,1¢ 2  2,[3,7],1  OK          2,3,7,1¢ 3  2,3,[7,1]  SWITCH 1,7  2,3,1,7¢ 4  [2,3],1,7  OK          2,3,1,7¢ 5  2,[3,1],7  SWITCH 1,3  2,1,3,7¢ 6  2,1,[3,7]  OK          2,1,3,7¢ 7  [2,1],3,7  SWITCH 1,2  1,2,3,7¢ 8  1,[2,3],7  OK          1,2,3,7¢ 9-12          OK          1,2,3,7¢¢      If  we  want  to sort in reverse¢ order from HIGH to LOW  than  we  can¢ change  the  greater  sign(>) in line¢ 140 to less(<).¢¢      Please key in  this  short  demo¢ program to see how it works. ¢¢      10 --¢      20 REM PUT NUMBERS INTO ARRAY¢      30 CLS:?:?¢      40 INPUT "HOW MANY NUMBERS TO¢         SORT";K¢      50 DIM A(K):?¢      60 FOR X = 1 TO K¢      70 INPUT "GIVE ME A NUMBER";N¢      80 A(X)=N:REM<--ARRAY¢      90 NEXT X¢      100 --¢      110 REM BUBBLE SORT¢      120 FOR T = 1 TO K¢      130 FOR Y = 1 TO K-1¢      140 IF A(Y+1)>=A(Y) THEN 180¢      150 TEMP = A(Y)¢      160 A(Y) = A(Y+1)¢      170 A(Y+1) = TEMP¢      180 NEXT Y¢      190 NEXT T¢      200 --¢      210 REM PRINT SORTED NUMBERS¢      220 ?:? "SORTED NUMBERS":?¢      230 FOR L = 1 TO K¢      240 ? A(L);" ";:REM<--ARRAY¢      250 NEXT L¢      260 --¢¢               MINI SORT¢¢      The MINI sort is faster than the¢ bubble  sort.  This  sort  finds  the¢ minimum valued element and places  it¢ in  the  first position of the array.¢ It keeps  on  doing  this  until  all¢ elements  are  arranged  from  LOW to¢ HIGH. In our program in  line  50  we¢ use  E=K. K is the number of elements¢ we have. The sort reduces K to 1.  We¢ need  the value of K to print out the¢ array, therefore we make it equal  to¢ E.¢¢      Please  key  in  this short demo¢ program to see how it works.¢¢      10 --¢      20 REM PUT NUMBERS IN THE ARRAY¢      30 CLS:?:?:K=0¢      40 INPUT "HOW MANY NUMBERS TO¢         SORT";K¢      50 DIM A(K):E=K¢      60 FOR X = 1 TO K¢      70 INPUT "GIVE ME A NUMBER";N¢      80 A(X)=N:REM<--ARRAY¢      90 NEXT X¢      100 --¢      110 REM MINI SORT¢      120 Y=A(1):Z=1¢      130 FOR R = 2 TO K¢      140 IF A(R)>=Y THEN Y=A(R):¢          Z=R¢      150 NEXT R¢      160 SS=A(K):A(K)=A(Z):A(Z)=SS¢      170 K=K-1:IF K>1 THEN 120¢      180 --¢      190 REM PRINT SORTED NUMBERS¢      200 ?:? "SORTED NUMBERS"¢      210 FOR T = 1 TO E¢      220 ? A(T);" ";¢      230 NEXT T¢      240 --¢¢         SORTING STRING ARRAYS¢         =====================¢¢        THE STRING BUBBLE SORT¢¢      For a full  understanding  of  a¢ STRING  BUBBLE  SORT  please read the¢ section on PSEUDO STRING  ARRAYS  and¢ BUBBLE SORT first.¢¢      First  we set up a PSEUDO STRING¢ ARRAY. Without  a  string  array  you¢ cannot  sort strings. We are going to¢ enter 4 words:¢¢      ZERO¢      ALL¢      HOUSE¢      COMPUTER¢¢      A String Bubble Sort  works  the¢ same  way  as  a  number Bubble Sort,¢ except each  element  is  longer.  We¢ switch  elements  if  they are not in¢ the right order - small to large. The¢ elements  or   substrings   in   this¢ demonstration are:¢¢      1 to 10 (ZERO------)¢     11 to 20 (ALL-------)¢     21 to 30 (HOUSE-----)¢     31 to 40 (COMPUTER--)¢¢      The confusion comes when we have¢ to specify the substrings or elements¢ for  switching.  In  order to clarify¢ this   we  use  line  180  to  assign¢ variables to these values.¢¢      B(beginning)=Y¢      E(ending)=Y+9¢     BB(begin next higher elemt)=Y+10¢     EE(end higher elemt)=Y+(10+9)¢¢      Please type in this  short  demo¢ program to see how it works.¢¢      10 --¢      20 REM INPUT WORDS INTO ARRAY¢      30 CLS:?¢      40 INPUT "HOW MANY WORDS TO¢         SORT";K¢      50 DIM A$(K*10),SUB$(10),¢         PAD$(10),TEMP$(10)¢      60 PAD$="          ":REM 10¢         SPACES¢      70 ?:? "MAX. LETTERS = 10":?¢      80 FOR N=1 TO K*10 STEP 10¢      90 INPUT "GIVE ME A WORD";SUB$¢     100 SL=LEN(SUB$)¢     110 IF SL<10 THEN SUB$(SL+1)=¢         PAD$¢     120 A$(N,N+9)=SUB$¢     130 NEXT N¢     140 --¢     150 REM STRING BUBBLE SORT¢     160 FOR T=1 TO K*10 STEP 10¢     170 FOR Y=1 TO (K*10)-10¢         STEP 10¢     180 B=Y:E=Y+9:BB=Y+10:¢         EE=Y+(10+9)¢     190 IF A$(BB,EE)>=A$(B,E)¢         THEN 230¢     200 TEMP$=A$(B,E)¢     210 A$(B,E)=A$(BB,EE)¢     220 A$(BB,EE)=TEMP$¢     230 NEXT Y¢     240 NEXT T¢     250 --¢     260 REM PRINT SORTED WORDS¢     270 ?:? "SORTED WORDS:":?¢     280 FOR L=1 TO K*10 STEP 10¢     290 ? A$(L,L+9)¢     300 NEXT L¢     310 --¢¢      A  line  by  line explanation of¢ this program is as follows:¢¢ 10-140 See the section on PSEUDO¢     STRING ARRAYS¢ 150 REM explanation¢ 160 Outer Bubble Sort loop.¢     K=number of words X the element¢     length. STEP = element length¢ 170 Inner loop must be 1 element ¢     less than the outer loop. That¢     is why we have (K*10)-10¢ 180-220 We examine each element. If¢     the 2nd element is larger than¢     the first element then it is OK.¢     (small to large) - no switching.¢     If it is not in the right order¢     then we do the switching, just¢     as we did with the number¢     bubble sort.¢ 230 End of inner loop¢ 240 End of outer loop¢ 250 30 dashes¢ 260 REM explanation¢ 270 Print¢ 280 Loop to display sorted words¢ 290 Print sorted words¢ 300 End of loop¢ 310 30 dashes¢¢      If   you  want  to  sort  larger¢ strings lets say 20  characters  long¢ then  change  every reference from 10¢ to 20. They are in lines 50, 60,  70,¢ 80,  110,       120(N,N+19), 160, 170¢ (E=Y+19, BB=Y+20, EE=Y+(20+19),  180,¢ 280 (A$=L,L+19)¢¢     If  you  want to sort from Z to A¢ then change the (>) in  line  190  to¢ (<)¢¢¢         THE SHELL STRING SORT¢         ---------------------¢¢      The  SHELL  SORT  is much faster¢ than the BUBBLE SORT. The  reason  it¢ is  faster  is  that  the  number  of¢ comparisons to be  made  is  reduced.¢ If you try to sort 2  words  or  less¢ than you will get an error because in¢ line 90 the FOR-NEXT loop becomes  an¢ illegal reverse loop (FOR T=1 TO 0)¢¢      In  line 210 we assign variables¢ to   the   element   beginning    and¢ endings.¢¢      B(beginning of element)=Y*10-9¢      E(ending of element)=Y*10¢      BB(Next higher elmt)=Z*10-9¢      EE(Ending element)=Z*10¢¢      Please  key  in  this short demo¢ program to see how it works.¢¢      10 --¢      20 REM INPUT STRING ARRAY¢      30 CLS:?¢      40 INPUT "HOW MANY WORDS TO ¢         SORT";K¢      50 DIM A$(K*10),SUB$(10),¢         PAD$(10),TEMP$(10)¢      60 PAD$="          ":REM 10¢         SPACES¢      70 ?:? "MAX. NUMBER OF LETTERS¢         = 10":?¢      80 FOR N=1 TO K*10 STEP 10¢      90 INPUT "GIVE ME A WORD";¢         SUB$¢     100 SL=LEN(SUB$)¢     110 IF SL<10 THEN SUB$(SL+1)=¢         PAD$¢     120 A$(N,N+9)=SUB$¢     130 NEXT N¢     140 --¢     150 REM SHELL SORT¢     160 X=1¢     170 X=2*X:IF X<=K THEN 170¢     180 X=INT(X/2):IF X=0 THEN 300¢     190 FOR T=1 TO K-X:Y=T¢     200 Z=Y+X¢     210 B=Y*10-9:E=Y*10:BB=Z*10-9:¢         EE=Z*10¢     220 IF A$(B,E)<=A$(BB,EE) THEN ¢         270¢     230 TEMP$=A$(B,E)¢     240 A$(B,E)=A$(BB,EE)¢     250 A$(BB,EE)=TEMP$¢     260 Y=Y-X:IF Y>0 THEN 200¢     270 NEXT T:GOTO 180¢     280 --¢     290 REM PRINT SORTED WORDS¢     300 ?:? "SORTED WORDS:":?¢     310 FOR L=1 TO K*10 STEP 10¢     320 ? A$(L,L+9)¢     330 NEXT L¢     340 --¢¢      If   you  want  to  sort  larger¢ strings,   lets   say   you  want  20¢ characters,   please   change   every¢ reference  from 10 to 20. They are in¢ liness:  50,   60,   70,   80,   110,¢ 120(N,N+19),  210(B=Y*20-19,  E=Y*20)¢ and  the  same  for  BB  and EE, 310,¢ 320(L,L+19).¢¢¢        RELATIONAL BUBBLE SORT¢        ----------------------¢¢      A relational sort is if you have¢ 2 arrays and they are related to each¢ other   in   some   way    and    the¢ relationship  has  to  be maintained.¢ For instance,  we  want  to  write  a¢ telephone  directory  program. In one¢ array we store the names and  in  the¢ other  we store the phone numbers. We¢ are going to sort the names  but  the¢ phone  numbers  always  have  to   be¢ switched  with the name so the proper¢ relationship is maintained.¢¢      When we  sort  with  the  Bubble¢ Sort  the  switching is done in lines¢ 240, 250, and  260.  It  is  done  as¢ follows:¢¢      240 TEMP$=A$(B,E):TEMP1$=¢          B$(B,E)¢      250 A$(B,E)=A$(BB,EE):B$(B,E)=¢          B$(BB,EE)¢      260 A$(BB,EE)=TEMP$:B$(BB,EE)=¢          TEMP1$¢¢      A$  is  the name array and B$ is¢ the phone number string array.  TEMP$¢ is in the name array and TEMP1$ is in¢ the phone number array. As we  switch¢ each  name  during  a sort so we also¢ switch the phone number array  so  it¢ maintains its proper relationship.¢¢      We  use  a  string array for the¢ numbers because many people use a '-'¢ in  their  phone numbers and a number¢ array would not accept it.  A  second¢ reason  is  that  if a number becomes¢ too   large   it   is   expressed  in¢ scientific notation. ¢¢      In our demo program we DIM  each¢ element  of the name and phone number¢ array to 10 to  make  it  simpler  to¢ understand.¢¢      Please  key  in  this short demo¢ program to see how it works.¢¢      10 --¢      20 REM INPUT NAMES AND NUMBERS¢         INTO THE STRING ARRAYS¢      30 CLS:?¢      40 INPUT "HOW MANY PHONE¢         NUMBERS TO SORT";K¢      50 DIM A$(K*10),B$(K*10),¢         SUB$(10),SUB1$(10),PAD$(10)¢         TEMP$(10),TEMP1$(10)¢      60 PAD$="          ":REM 10 ¢         SPACES¢      70 ?:? "MAX. LETTERS OR¢         NUMBERS = 10":?¢      80 FOR N=1 TO K*10 STEP 10¢      90 INPUT "GIVE ME THE NAME";¢         SUB$¢     100 INPUT "GIVE ME THE NUMBER";¢         SUB1$¢     110 ?:SL=LEN(SUB$)¢     120 SL1=LEN(SUB1$)¢     130 IF SL<10 THEN SUB$(SL+1)=¢         PAD$¢     140 IF SL1<10 THEN SUB1$(SL1+1)=¢         PAD$¢     150 A$(N,N+9)=SUB$¢     160 B$(N,N+9)=SUB1$¢     170 NEXT N¢     180 --¢     190 REM RELATIONAL BUBBLE SORT¢     200 FOR T=1 TO K*10 STEP 10¢     210 FOR Y=1 TO (K*10)-10 STEP 10¢     220 B=Y:E=Y+9:BB=Y+10:¢         EE=Y+(10+9)¢     230 IF A$(BB,EE)>=A$(B,E) THEN¢         270¢     240 TEMP$=A$(B,E):TEMP1$=¢         B$(B,E)¢     250 A$(B,E)=A$(BB,EE):B$(B,E)=¢         B$(BB,EE)¢     260 A$(BB,EE)=TEMP$:B$(BB,EE)=¢         TEMP1$¢     270 NEXT Y¢     280 NEXT T¢     290 --¢     300 CLS¢     310 REM PRINT OUT SORTED PHONE¢         LIST¢     320 ?:? "    TELEPHONE LIST":?¢     330 FOR L=1 TO K*10 STEP 10¢     340 ? A$(L,L+9);B$(L,L+9)¢     350 NEXT L¢     360 --¢¢     The two arrays can use  the  same¢ PAD$  (ln  #60)  because they are the¢ same size.  They  can  use  the  same¢ beginning  and ending element numbers¢ because they are the  same  size  (ln¢ #220)¢¢     If you want a printed list please¢ change lines 320 and 340  from  PRINT¢ to LPRINT.¢¢     In  a  similar  manner  you could¢ have  a  relational  sort  between  a¢ number array and a string array.  For¢ example  you  want to sort by score a¢ bowling league.  The  sort  would  be¢ done  on  the scores(number sort) and¢ the  names  would  have  to  maintain¢ their relationship to the score.¢¢     To get a clear  understanding  of¢ relational  sorts,  please  read  the¢ section  on  ARRAYS,  PSEUDO   STRING¢ ARRAYS, NUMBER BUBBLE SORT and STRING¢ BUBBLE¢                                      ¢               ADDENDUM¢               --------¢¢     Sometimes  it  is  necessary   to¢ construct  a  string   array   in   a¢ different  manner  than I have shown.¢ For example we want  a  string  array¢ with 21 letters. This is an alternate¢ way of doing it.   ¢¢      10 DIM ARRAY$(5*21),B$(21),¢         PAD$(21)¢      20 FOR X=1 TO 5¢      30 PAD$="                     "¢      40 INPUT "GIVE ME A NAME";B$¢      50 BL=LEN(B$):IF BL<21 THEN¢         B$(BL+1)=PAD$¢      60 ARRAY$(X*21-20,X*21)=¢         B$:REM ARRAY¢      70 NEXT X¢¢      In line 60   X*21-20,X*21.  This¢ will  create  the element length that¢ we previously  used  a  FOR-NEXT-STEP¢ LOOP  for.  In all other respects the¢ program   remains   the   same.   For¢ example,  when  X=1 the elements will¢ be (1*21)21-20 or 1 the other  number¢ will be (1*21)or 21. Thus the element¢ length will be 1 to 21 on  the  first¢ pass of the loop. In a similar manner¢ all the other element numbers will be¢ generated.¢¢ >>>>>>>>>>>>>>>>  END <<<<<<<<<<<<<<<¢¢