;------------------------------------------------------------------------------------------------------------------------------------------ #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