On 09/19/2017 07:54 AM, Dyck, Lionel B. (TRA) wrote:
> I needed a simple sort for the words in a string and came up with this - hope 
> it helps others.  There are probably better ways to do this so feel free to 
> share:
>
> /* ------------------ rexx ------------------------ *
> | Simple bubble sort for words in a string (array) |
> * ------------------------------------------------ */
>   string = '10 0 1 9 6 2 4 3'
>   do imx = 1 to words(string)-1
>     do im = 1 to words(string)
>       w1 = word(string,im)
>       w2 = word(string,im+1)
>       if w1 > w2 then do
>         if im > 1
>         then  lm = subword(string,1,im-1)
>         else lm = ''
>         rm = subword(string,im+2)
>         string = lm w2 w1 rm
>       end
>     end
>   end
>   say string
>
>
> --------------------------------------------------------------------------
> Lionel B. Dyck
> Mainframe Systems Programmer - TRA
>
>
For sorting 8 values it's not going to make any difference what sort method is 
used, but I wish people would just stop teaching Bubble Sort to 
new programmers as a sorting algorithm and teach an Insertion Sort instead.  

An Insertion Sort is even easier to explain than a Bubble Sort, not any more 
difficult to program, and will always out perform a Bubble Sort, with 
the difference becoming more significant for larger N.  Of course for really 
large N, you should always look at snazzier sorting techniques, but they 
are significantly more complex and probably not something one should attempt to 
write from memory.

Here is an example of an Insertion Sort  for similar data, implemented as a 
REXX Procedure on a Linux platform using oorexx.  The 10K repetition loop 
and use of 50 rather than 8 values was just to get a measurable execution time 
comparison on my Linux platform.  For 10K sorts of 50 values 
Bubble Sort took 33 seconds vs only 4 seconds for same data using the Insertion 
Sort.

#!/usr/bin/rexx
/* ------------------ rexx ------------------------ *
| Simple insertion sort for words in a string (array) |
* ------------------------------------------------ */
  Do times =  1 To 10000

      string = "10 0 200  50 11 32 54 23 13 17 35 14 77 52 92 600 21 45 501 399 
27 15 22 425 301" ,
               "7  45 65 201 41 37 39 26 19 99 87 73 61 59 95 306 29 48 555 333 
22 74 85 444 222"
      Call Insert_Sort
   End
  Say string
  Exit

Insert_Sort: Procedure Expose string
  n = Words(string)
   If n< 2 Then Return
  sorted = Word(string,1)
  Do i = 2 To n
    next = Word(string,i)
    Do j = 1 To i-1  /* find where to insert next value among already sorted 
values */
       If next <  Word(sorted,j)  Then Do /* must insert before jth value */
        If j > 1 Then lm = Subword(sorted,1,j-1)
                 Else lm = ''
        sorted = lm next Subword(sorted,j)
        Leave j
      End
      If j = i-1 Then sorted = sorted next
    End
  End
  string = sorted
Return
-- 
Joel C. Ewing,    Bentonville, AR       [email protected] 

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to