Sort

可以使用sort包对数据集合进行排序,该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。

数据集合排序

  • 数据集合需要实现sort.Interface接口的三个方法,该接口定义为:

    type Interface interface {
      Len() int
      Less(i, j int) bool
      Swap(i, j int)
    }
  • 数据集合实现了这三个方法后,即可调用sort包的Sort()方法排序。Sort()方法定义为:

    func Sort(data interface)
  • 判断数据集合是否已经排好序,可以使用IsSorted方法:

    func IsSorted(data Interface) bool {
      n := data.Len()
      for i := n - 1; i > 0; i-- {
        if data.Less(i, i-1) {
          return false
        }
      }
      return true
    }
  • Reverse()允许将数据按Less()定义的排序方式逆序排序:

    type reverse struct {
      Interface
    }
    
    func (r reverse) Less (i, j int) bool {
      return r.Interface.Less(j, i)
    }
    
    func Reverse(data Interface) Interface {
      return &reverse{data}
    }
  • Search()方法使用二分查找算法来找到能使f(x)(0<=x<n)返回true的最小值i

    前提条件条件:f(x)(0<=x<i)均返回falsef(x)(i<=x<n)均返回true

示例

type Person struct {
    age  int
    name string
}

type MyPerson []Person

func (m MyPerson) Len() int {
    return len(m)
}

func (m MyPerson) Less(i, j int) bool {
    return m[i].age < m[j].age
}

func (m MyPerson) Swap(i, j int) {
    m[i], m[j] = m[j], m[i]
    return
}

func main() {
  stus := MyPerson{
    {30, "c"},
    {25, "b"},
    {20, "a"},
  }
  sort.Sort(stus)
  fmt.Println(stus)
}

内部数据类型排序

sort包原生支持[]int[]float64[]string三种内建数据类型切片的排序操作。

  • []int

    a := []int{5, 4, 12, 23, 42}
    sort.Ints(a)
  • []float64

    a := []float64{1.3, 1.2, 0.4, 2.3}
    sort.Float64s(a)
  • []string

    a := []string{"a", "b", "ab", "ba"}
    sort.Strings(a)

Last updated

Was this helpful?