Documentation
¶
Overview ¶
Package sorty is a type-specific, fast, efficient, concurrent / parallel sorting library. It is an innovative QuickSort implementation, hence in-place and does not require extra memory. You can call:
import "github.com/jfcg/sorty/v2" sorty.SortSlice(native_slice) // []int, []float64, []string, []*T etc. in ascending order sorty.SortLen(len_slice) // []string or [][]T 'by length' in ascending order sorty.Sort(n, lesswap) // lesswap() based
Index ¶
Constants ¶
const MaxLenIns = 60
MaxLenIns is the default maximum slice length for insertion sort.
const MaxLenInsFC = 30
MaxLenInsFC is the maximum slice length for insertion sort when sorting strings or calling Sort().
const MaxLenRec = 600
MaxLenRec is the default maximum slice length for recursion when there is goroutine quota. So MaxLenRec+1 is the minimum slice length for new sorting goroutines.
const MaxLenRecFC = 300
MaxLenRecFC is the maximum slice length for recursion when sorting strings or calling Sort().
Variables ¶
var MaxGor uint64 = 3
MaxGor is the maximum number of goroutines (including caller) that can be concurrently used for sorting per Sort*() call. MaxGor can be changed live, even during ongoing Sort*() calls. MaxGor ≤ 1 (or a short input) yields single-goroutine sorting: sorty will not create any goroutines or channel.
var NaNoption = NaNlarge
NaNoption determines how sorty handles NaNs in SortSlice() and IsSortedSlice(). NaNs can be treated as smaller than, ignored or larger than other float values. By default NaNs will end up at the end of your ascending-sorted slice. If your slice contains NaNs and you choose to ignore them, the result is undefined behavior, and almost always not sorted properly. sorty is only tested with small/large options.
Functions ¶
func IsSorted ¶
IsSorted returns 0 if underlying collection of length n is sorted, otherwise it returns i > 0 with less(i,i-1) = true.
func IsSortedLen ¶
IsSortedLen returns 0 if ar is sorted 'by length' in ascending order, otherwise it returns i > 0 with len(ar[i]) < len(ar[i-1]). ar's (underlying) type can be
[]string, [][]T // for any type T
otherwise it panics.
func IsSortedSlice ¶
IsSortedSlice returns 0 if ar is sorted in ascending order, otherwise it returns i > 0 with ar[i] < ar[i-1]. ar's (underlying) type can be
[]int, []int32, []int64, []uint, []uint32, []uint64, []uintptr, []float32, []float64, []string, [][]byte, []unsafe.Pointer, []*T // for any type T
otherwise it panics.
func Search ¶
Search returns lowest integer k in [0,n) where fn(k) is true, assuming:
fn(k) implies fn(k+1)
If there is no such k, it returns n. It can be used to locate an element in a sorted collection.
func Sort ¶
Sort concurrently sorts underlying collection of length n via lsw(). Once for each non-trivial type you want to sort in a certain way, you can implement a custom sorting routine (for a slice for example) as:
func SortTypeAscending(slc []Type) { lsw := func(i, k, r, s int) bool { if slc[i].Key < slc[k].Key { // strict comparator like < or > if r != s { slc[r], slc[s] = slc[s], slc[r] } return true } return false } sorty.Sort(len(slc), lsw) }
Lesswap is a contract between users and sorty. Strict comparator, r!=s check, swap and returns are all necessary.
Types ¶
type FloatOption ¶ added in v2.1.0
type FloatOption int32
const ( NaNsmall FloatOption = iota - 1 NaNignore NaNlarge )