Sorting algorithms/Radix sort: Difference between revisions

Line 1,897:
NEXT
Next
SUB RadixSort (aCGSortLibArr() AS DOUBLE, start&, finish&, order&)
ArrayIsInteger aCGSortLibArr(), start&, finish&, errindex&, errcon&
IF errcon& THEN
'* use another stable sort and sort anyway
MergeSort aCGSortLibArr(), start&, finish&, order&
ELSE
DIM RSMMrec AS MinMaxRec
GetMinMaxArray aCGSortLibArr(), start&, finish&, RSMMrec
IF CGSortLibArr(RSMMrec.min) = CGSortLibArr(RSMMrec.max) THEN EXIT SUB '* no div0 bombs
delta# = aCGSortLibArr(RSMMrec.max) - aCGSortLibArr(RSMMrec.min)
DIM pow2 AS _UNSIGNED _INTEGER64
DIM NtmpN AS _UNSIGNED _INTEGER64
DIM Int64MaxShift AS _INTEGER64: Int64MaxShift = 2 ^ 64
REDIM ct&(-10 TO 1)
REDIM RadixCGSortLibArr(0 TO 1, finish& - start&) AS DOUBLE
SELECT CASE order&
Line 1,918:
DO UNTIL bits& < 0
FOR i& = start& TO finish&
NtmpN = Int64MaxShift * (aCGSortLibArr(i&) - aCGSortLibArr(RSMMrec.min)) / (delta#)
IF NtmpN AND pow2 THEN
tmpradix% = 1
Line 1,924:
tmpradix% = 0
END IF
RadixCGSortLibArr(tmpradix%, ct&(tmpradix%)) = aCGSortLibArr(i&)
ct&(tmpradix%) = ct&(tmpradix%) + 1
NEXT
Line 1,930:
FOR i& = 0 TO 1
FOR j& = 0 TO ct&(i&) - 1
aCGSortLibArr(c&) = RadixCGSortLibArr(i&, j&)
c& = c& + 1
NEXT
Line 1,942:
FOR bits& = 0 TO 63
FOR i& = start& TO finish&
NtmpN = Int64MaxShift * (aCGSortLibArr(i&) - aCGSortLibArr(RSMMrec.min)) / (delta#)
IF NtmpN AND pow2 THEN
tmpradix% = 1
Line 1,948:
tmpradix% = 0
END IF
RadixCGSortLibArr(tmpradix%, ct&(tmpradix%)) = aCGSortLibArr(i&)
ct&(tmpradix%) = ct&(tmpradix%) + 1
NEXT
Line 1,954:
FOR i& = 0 TO 1
FOR j& = 0 TO ct&(i&) - 1
aCGSortLibArr(c&) = RadixCGSortLibArr(i&, j&)
c& = c& + 1
NEXT
Anonymous user