欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

go语言中排序sort的使用方法示例

程序员文章站 2022-11-05 22:35:41
前言 sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序...

前言

sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序时无需考虑使用那种排序方式,sort.interface定义的三个方法:获取数据集合长度的len()方法、比较两个元素大小的less()方法和交换两个元素位置的swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。

已知一个的struct组成的数组,现在要按照数组中的一个字段排序。python有sort方法,那golang要怎么实现呢?其实golang也有sort方法,并且使用简单,功能强大。

方法如下:

我们先看一下sort.sort()的源码

func sort(data interface) {
  // switch to heapsort if depth of 2*ceil(lg(n+1)) is reached.
  n := data.len()
  maxdepth := 0
  for i := n; i > 0; i >>= 1 {
    maxdepth++
  }
  maxdepth *= 2
  quicksort(data, 0, n, maxdepth)
}
 
func quicksort(data interface, a, b, maxdepth int) {
  for b-a > 12 { // use shellsort for slices <= 12 elements
    if maxdepth == 0 {
      heapsort(data, a, b)
      return
    }
    maxdepth--
    mlo, mhi := dopivot(data, a, b)
    // avoiding recursion on the larger subproblem guarantees
    // a stack depth of at most lg(b-a).
    if mlo-a < b-mhi {
      quicksort(data, a, mlo, maxdepth)
      a = mhi // i.e., quicksort(data, mhi, b)
    } else {
      quicksort(data, mhi, b, maxdepth)
      b = mlo // i.e., quicksort(data, a, mlo)
    }
  }
  if b-a > 1 {
    // do shellsort pass with gap 6
    // it could be written in this simplified form cause b-a <= 12
    for i := a + 6; i < b; i++ {
      if data.less(i, i-6) {
        data.swap(i, i-6)
      }
    }
    insertionsort(data, a, b)
  }
}

通过quicksort方法我们看出,根据数据不同的状况,quicksort会选择堆排,快排,插入排中更高效的排序方法,这个我们暂时先不深究,先看如何使用sort.sort()

从源码中我们发现数据data,需要自带len,less,swap三种方法,所以使用sort.sort()前,我们需要自己实现len,less,swap来确定按照什么规则排序。

来实践一下,我们先创建一个结构体数组,结构体包含字段count,我们按照count对其排序。

package main
 
import (
  "sort" 
)
 
type subinfo struct {
  count uint  `json:"count"`
}
 
type sublist []*subinfo
 
func (p sublist) swap(i, j int)   { p[i], p[j] = p[j], p[i] }
func (p sublist) len() int      { return len(p) }
func (p sublist) less(i, j int) bool { return p[i].count > p[j].count }
 
func main() {
  st_list := sublist{}
  for i := 0; i < 10; i ++{
    _sub := &subinfo{
      count: uint(i),
    }
    st_list = append(st_list, _sub)
  }
  sort.sort(st_list)
  return
}

需要注意的是,st_list只能初始化成sublist{} ,而不能初始化为make([]*subinfo, 0) ,虽然他们结构是一样的。

最近诸事不顺,心烦的一匹,上周也拖更了,总之希望大家事事顺心,心爱的人身体健康。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。