989
989
function pagedmergesort! (v:: AbstractVector{T} , lo:: Integer , hi:: Integer , buf:: AbstractVector{T} , blockLocation, o= Base. Order. Forward) where T
990
990
len = hi + 1 - lo
991
991
if len <= Base. SMALL_THRESHOLD
992
- Base. Sort. sort! (v, lo, hi, Base. Sort. InsertionSortAlg (), o)
993
- return
992
+ return Base. Sort. sort! (v, lo, hi, Base. Sort. InsertionSortAlg (), o)
994
993
end
995
994
m = Base. midpoint (lo,hi)
996
995
pagedmergesort! (v,lo,m,buf,blockLocation,o)
@@ -1000,13 +999,13 @@ function pagedmergesort!(v::AbstractVector{T}, lo::Integer, hi::Integer, buf::Ab
1000
999
else
1001
1000
pagedMerge! (v, buf, lo, m, hi, blockLocation, o)
1002
1001
end
1002
+ return v
1003
1003
end
1004
1004
1005
1005
function threaded_pagedmergesort! (v:: AbstractVector , lo:: Integer , hi:: Integer , bufs, blockLocations, c:: Channel , threadingThreshold:: Integer , o= Base. Order. Forward)
1006
1006
len = hi + 1 - lo
1007
1007
if len <= Base. SMALL_THRESHOLD
1008
- Base. Sort. sort! (v, lo, hi, Base. Sort. InsertionSortAlg (), o)
1009
- return
1008
+ return Base. Sort. sort! (v, lo, hi, Base. Sort. InsertionSortAlg (), o)
1010
1009
end
1011
1010
m = Base. midpoint (lo,hi)
1012
1011
if len > threadingThreshold
@@ -1029,25 +1028,27 @@ function threaded_pagedmergesort!(v::AbstractVector, lo::Integer, hi::Integer, b
1029
1028
pagedMerge! (v, buf, lo, m, hi, blockLocation, o)
1030
1029
end
1031
1030
put! (c,id)
1031
+ return v
1032
1032
end
1033
1033
1034
1034
const PAGEDMERGESORT_THREADING_THRESHOLD = 2 ^ 13
1035
1035
1036
1036
function sort! (v:: AbstractVector , lo:: Integer , hi:: Integer , a:: PagedMergeSortAlg , o:: Ordering )
1037
- lo >= hi && return
1037
+ lo >= hi && return v
1038
1038
n = hi + 1 - lo
1039
1039
blocksize = isqrt (n)
1040
1040
buf = Vector {eltype(v)} (undef,3 blocksize)
1041
1041
nBlocks = n ÷ blocksize
1042
1042
blockLocation = Vector {Int} (undef,nBlocks+ 1 )
1043
1043
pagedmergesort! (v,lo,hi,buf,blockLocation,o)
1044
+ return v
1044
1045
end
1045
1046
1046
1047
function sort! (v:: AbstractVector , lo:: Integer , hi:: Integer , a:: ThreadedPagedMergeSortAlg , o:: Ordering )
1047
- lo >= hi && return
1048
+ lo >= hi && return v
1048
1049
n = hi + 1 - lo
1049
1050
nThreads= Threads. nthreads ()
1050
- (n < PAGEDMERGESORT_THREADING_THRESHOLD || nThreads < 2 ) && ( sort! (v, lo, hi, PagedMergeSort, o); return )
1051
+ (n < PAGEDMERGESORT_THREADING_THRESHOLD || nThreads < 2 ) && return sort! (v, lo, hi, PagedMergeSort, o)
1051
1052
threadingThreshold = max (n ÷ 4 nThreads, PAGEDMERGESORT_THREADING_THRESHOLD)
1052
1053
blocksize = isqrt (n)
1053
1054
nBlocks = n ÷ blocksize
@@ -1058,5 +1059,6 @@ function sort!(v::AbstractVector, lo::Integer, hi::Integer, a::ThreadedPagedMerg
1058
1059
put! (c,i)
1059
1060
end
1060
1061
threaded_pagedmergesort! (v,lo,hi,bufs,blockLocation,c,threadingThreshold,o)
1062
+ return v
1061
1063
end
1062
1064
end # module
0 commit comments