Files
obitools4/pkg/goutils/ranks.go

34 lines
728 B
Go

package goutils
import "sort"
// intRanker is a helper type for the rank function.
type intRanker struct {
x []int // Data to be ranked.
r []int // A list of indexes into f that reflects rank order after sorting.
}
// ranker satisfies the sort.Interface without mutating the reference slice, f.
func (r intRanker) Len() int { return len(r.x) }
func (r intRanker) Less(i, j int) bool { return r.x[r.r[i]] < r.x[r.r[j]] }
func (r intRanker) Swap(i, j int) { r.r[i], r.r[j] = r.r[j], r.r[i] }
func IntOrder(data []int) []int {
if len(data) == 0 {
return nil
}
rk := intRanker{
x: data,
r: make([]int, len(data)),
}
for i := 0; i < len(data); i++ {
rk.r[i] = i
}
sort.Sort(rk)
return rk.r
}