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 <<<<<<<<<<<<<<<››