排序。Sort() 与切片。排序()

sort.Sort() vs slices.Sort()

提问人:Eric 提问时间:4/2/2023 更新时间:11/16/2023 访问量:1509

问:

给定一个 ,例如:[]intis := []int{2, 4, 1, 3}

可以通过以下方式进行排序:

  1. sort.Sort(),例如:
    sort.Sort(sort.IntSlice(is))
    
  2. slices.Sort(),例如:
    slices.Sort(is)
    

我知道是经验,从.
除此之外,排序 an 时有什么区别吗,通常首选哪个?
slices.Sort()"golang.org/x/exp/slices"[]int

排序 Go 切片

评论

1赞 Volker 4/2/2023
要对 []int 进行排序,请使用 none 但 sort。整数。

答:

1赞 VonC 11/16/2023 #1

Andreas Auernhammer 的文章“SORTING STRINGS IN GO, FAST & SLOW”列出了这两个包之间的区别:

sort 包和 slices 包的区别在于:

  • sort使用函数进行比较,而Less(i, j int) bool
  • slices使用 .Cmp func(a,b T) int

但是,使用切片包进行分拣比分拣包快约 70%。[]intsort

注意:这篇文章是关于对字符串进行排序的:

那么,为什么排序数字更快,但排序字符串更慢呢?
因为字符串。比较:三向字符串比较可能会比较两个字符串两次,而包只比较两个字符串一次,并且编译器还不够聪明,无法用单个函数调用替换此模式。
sort

但是对于 ,作为某种源代码。Ints() 显示:int

// Ints sorts a slice of ints in increasing order.
//
// Note: consider using the newer slices.Sort function, which runs faster.
func Ints(x []int) { Sort(IntSlice(x)) }

在这种情况下,切片。排序[S ~[]E, E cmp.Ordered](x S) 仍然是新的最佳选择。