You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

sort.go 1.0 kB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package sort2
  2. import (
  3. "sort"
  4. "golang.org/x/exp/constraints"
  5. )
  6. type Comparer[T any] func(left T, right T) int
  7. type sorter[T any] struct {
  8. arr []T
  9. cmp Comparer[T]
  10. }
  11. func (s sorter[T]) Len() int {
  12. return len(s.arr)
  13. }
  14. func (s sorter[T]) Less(i int, j int) bool {
  15. ret := s.cmp(s.arr[i], s.arr[j])
  16. return ret < 0
  17. }
  18. func (s sorter[T]) Swap(i int, j int) {
  19. s.arr[i], s.arr[j] = s.arr[j], s.arr[i]
  20. }
  21. func Sort[T any](arr []T, cmp Comparer[T]) []T {
  22. st := sorter[T]{
  23. arr: arr,
  24. cmp: cmp,
  25. }
  26. sort.Sort(st)
  27. return arr
  28. }
  29. func SortAsc[T constraints.Ordered](arr []T) []T {
  30. return Sort(arr, Cmp[T])
  31. }
  32. func SortDesc[T constraints.Ordered](arr []T) []T {
  33. return Sort(arr, func(left, right T) int { return Cmp(right, left) })
  34. }
  35. // false < true
  36. func CmpBool(left, right bool) int {
  37. leftVal := 0
  38. if left {
  39. leftVal = 1
  40. }
  41. rightVal := 0
  42. if right {
  43. rightVal = 1
  44. }
  45. return leftVal - rightVal
  46. }
  47. func Cmp[T constraints.Ordered](left, right T) int {
  48. if left == right {
  49. return 0
  50. }
  51. if left < right {
  52. return -1
  53. }
  54. return 1
  55. }