sort.Sort() 与 slices.Sort()

问题描述 投票:0回答:1

给出

[]int
,例如:
is := []int{2, 4, 1, 3}

可以通过以下方式排序:

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

我知道

slices.Sort()
是经验,来自
"golang.org/x/exp/slices"

除此之外,对
[]int
进行排序时有什么区别吗?通常优先选择哪一个?

sorting go slice
1个回答
0
投票

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

sort
slices
套餐的区别在于:

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

但是使用 slices 包对

[]int
进行排序比
sort
包快约 70%。

注意:本文是关于字符串排序的:

那么,怎么可能数字排序更快,而字符串排序却更慢呢?
因为

strings.Compare
:三向字符串比较可能会比较两个字符串两次,而
sort
包仅比较两个字符串一次,并且编译器还不够智能,无法用单个函数调用替换此模式。

但是对于

int
,如sort.Ints()
源代码所示:

// 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)) }

在这种情况下,

slices.Sort[S ~[]E, E cmp.Ordered](x S)
仍然是新的最佳选择。

© www.soinside.com 2019 - 2024. All rights reserved.