udfArrayShellSortL
arr udfArrayShellSortL (arr)
;------------------------------------------------------------------------------------------------------------------------------------------
#DefineFunction udfArrayShellSortL (arrArray)
If !ArrInfo (arrArray, -1) Then Return ArrDimension (0) ; Invalid input array, return empty valid dim-0 array.
If ArrInfo (arrArray, 0) != 1 Then Return ArrDimension (0) ; Only dim-1 array allowed, return empty valid dim-0 array.
intElements = ArrInfo (arrArray, 1)
If intElements == 0 Then Return ArrDimension (0) ; Input array has no elements, return empty valid dim-0 array.
If intElements == 1 Then Return arrArray ; Input array has only one element, return the input array.
intHigh = intElements - 1
intLow = 0
intC = 0
intH = 0
intI = 0
intJ = 0
intT = 0
arrCols = Arrayize ("1391376,463792,198768,86961,33936,13776,4592,1968,861,336,112,48,21,7,3,1", ",")
For intC = 0 To 15
   intH = arrCols [intC]
   For intI = intH To intHigh
      intJ = intI
      anyValue = arrArray [intJ]
      While @TRUE
         intT = intJ - intH
         If arrArray [intT] <= anyValue Then Break
         arrArray [intJ] = arrArray [intT]
         intJ = intT
         If intJ < intH Then Break
      EndWhile
      arrArray [intJ] = anyValue
   Next
Next
Drop (aCols)
Return arrArray
;..........................................................................................................................................
; Shellsort algorithm adopted from:
; 'H.W. Lang: Algorithmen in Java. Oldenbourg (2003)'
; http://www.iti.fh-flensburg.de/lang/algorithmen/algo.htm
;..........................................................................................................................................
; h-sequence "1391376,463792,198768,86961,33936,13776,4592,1968,861,336,112,48,21,7,3,1" due to Sedgewick.
; R. Sedgewick: Analysis of Shellsort and Related Algorithms.
; In: Josep Díaz, Maria Serna (Eds.):
; Algorithms - ESA '96, Fourth Annual European Symposium, Barcelona, Lecture Notes in Computer Science, Vol. 1136, Springer, 1-11 (1996)
;..........................................................................................................................................
; Start sorting with: "udfArrayshellSortL (arrArray)"
;..........................................................................................................................................
#EndFunction
;------------------------------------------------------------------------------------------------------------------------------------------

;----------------------------------------------------------------------------------------------------------------------
#DefineFunction udfArrayItemize (arrArray, strDelimiter)
If !ArrInfo (arrArray, -1) Then Return "" ; No array.
If !ArrInfo (arrArray, 6) Then Return "" ; No elements.
If ArrInfo (arrArray, 0) > 1 Then Return "" ; Too much dimensions.
strItemList = ""
intHigh = Max (ArrInfo (arrArray, 1) - 1, 0)
intLow = 0
For intElem = intLow To intHigh
   If !!VarType (arrArray [intElem])
      strItemList = ItemInsert (arrArray [intElem], -1, strItemList, strDelimiter)
   Else
      strItemList = ItemInsert ("", -1, strItemList, strDelimiter)
   EndIf
Next
Return strItemList
;----------------------------------------------------------------------------------------------------------------------
; This UDF "udfArrayItemize" converts a given dim-1 array into an itemlist
; with each item separated by delimiter character.
;
; Example: strMyItemList = udfArrayItemize (arrMyArray, @TAB)
; Creates an itemList from array.
;
; Note:
; This UDF supports only dim-1 array.
; An array element which is not initialized has a Vartype=0 (undefined).
; Therefore an empty item will be appended to target itemlist.
;
; Detlev Dalitz.20020718.20090508.
;----------------------------------------------------------------------------------------------------------------------
#EndFunction
;----------------------------------------------------------------------------------------------------------------------


; Test.

strMsgTitle = "Demo: udfArrayShellSortL (arrArray)"
strMsgText = ""

strDelimiter = ","
strItemList = "22,q,w,e,r,t,T,999,a,s,d,f,1,/z,B5,-196" ; 16 Items.

arrA = Arrayize (strItemList, strDelimiter)
arrB = Arrayize (strItemList, strDelimiter)

arrB = udfArrayShellSortL (arrB)

strMsgText = strMsgText : "Array A: " : @LF : udfArrayItemize (arrA, strDelimiter) : @LF : @LF ; "22,q,w,e,r,t,T,999,a,s,d,f,1,/z,B5,-196"
strMsgText = strMsgText : "Array B sorted: " : @LF : udfArrayItemize (arrB, strDelimiter) : @LF : @LF ; "/z,-196,1,22,999,a,B5,d,e,f,q,r,s,t,T,w"

Message (strMsgTitle, strMsgText)

Exit