Golang 数据排序

岳阳小罗

Golang 数据排序 - 简书sort.Interface 接口 这个接口是 sort 包的核心,它有3个方法。这是 Golang 很酷的一个特性,只要数据类型满足 sort.Interface 接口,就...https://www.jianshu.com/p/1f42f2ba6c0d

sort.Interface 接口

这个接口是 sort 包的核心,它有3个方法。这是 Golang 很酷的一个特性,只要数据类型满足 sort.Interface 接口,就可以用sort包的函数进行排序。

// 一个满足sort.Interface接口的(集合)类型可以被本包的函数进行排序。
// 方法要求集合中的元素可以被整数索引。
type Interface interface {// Len方法返回集合中的元素个数Len() int// Less方法报告索引i的元素是否比索引j的元素小Less(i, j int) bool// Swap方法交换索引i和j的两个元素Swap(i, j int)
}

Example1

package mainimport ("fmt""sort"
)//自定义一个类型
type ints []intfunc (s ints) Len() int           { return len(s) }
func (s ints) Less(i, j int) bool { return s[i] < s[j] }
func (s ints) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }func main() {nums := []int{9, 8, 5, 4, 7, 6, 3, 0, 1, 2}sort.Sort(ints(nums)) //进行排序fmt.Println(nums)
}

Output: [0 1 2 3 4 5 6 7 8 9]

Example2

package mainimport ("fmt""sort"
)type Person struct {Name stringAge  int
}type Persons []Personfunc (s Persons) Len() int           { return len(s) }
func (s Persons) Less(i, j int) bool { return s[i].Age < s[j].Age }
func (s Persons) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }func main() {p := []Person{Person{"Lily", 20}, Person{"Bing", 18}, Person{"Tom", 23}, Person{"Vivy", 16}, Person{"John", 18}}sort.Sort(sort.Reverse(Persons(p))) //sort.Reverse 生成递减序列fmt.Println(p)
}

Output: [{Tom 23} {Lily 20} {Bing 18} {John 18} {Vivy 16}]

sort 包内置的排序方法

So easy ! 看了2个例子你应该明白了吧!

方法 说明
func Sort(data Interface) 递增排序,不能保证排序的稳定性,即不保证相等元素的相对次序不变。用的是快速排序算法
func Stable(data Interface) 递增排序,保证排序的稳定性,相等元素的相对次序不变。用的是插入排序算法
func IsSorted(data Interface) bool 判断data是否已经被递增排序
func Reverse(data Interface) Interface 对该接口排序可生成递减序列
func Ints(a []int) 将 []int 排序为递增顺序
func IntsAreSorted(a []int) bool 检查 []int 是否已排序为递增顺序
func Float64s(a []float64) 将 []float64 排序为递增顺序
func Float64sAreSorted(a []float64) bool 检查 []float64 是否已排序为递增顺序
func Strings(a []string) 将 []string 排序为递增顺序
func StringsAreSorted(a []string) bool 检查 []string 是否已排序为递增顺序

Example:

s := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(s)
fmt.Println(s)

Output: [1 2 3 4 5 6]

使用自定义排序算法

package mainimport ("fmt""sort"
)//bubbleSort 冒泡排序
func bubbleSort(data sort.Interface) {r := data.Len() - 1for i := 0; i < r; i++ {for j := r; j > i; j-- {if data.Less(j, j-1) {data.Swap(j, j-1)}}}
}//insertSort 插入排序
func insertSort(data sort.Interface) {r := data.Len() - 1for i := 1; i <= r; i++ {for j := i; j > 0 && data.Less(j, j-1); j-- {data.Swap(j, j-1)}}
}//selectSort 选择排序
func selectSort(data sort.Interface) {r := data.Len() - 1for i := 0; i < r; i++ {min := ifor j := i + 1; j <= r; j++ {if data.Less(j, min) {min = j}}data.Swap(i, min)}
}func main() {nums := []int{9, 8, 5, 4, 7, 6, 3, 0, 1, 2}ints := sort.IntSlice(nums) //IntSlice给[]int添加方法以满足Interface接口,以便排序为递增序列。bubbleSort(ints) //使用冒泡排序fmt.Println(ints)
}

output: [0 1 2 3 4 5 6 7 8 9]

搜索

搜索和排序是2兄弟,搜索是从已经排序的数据中返回数据的位置。

方法 说明
func SearchInts(a []int, x int) int SearchInts在递增顺序的a中搜索x,返回x的索引。如果查找不到,返回值是x应该插入a的位置(以保证a的递增顺序),返回值可以是len(a)。是Search函数函数的包装。
func SearchFloat64s(a []float64, x float64) int 同上,只是数据类型不同
func SearchStrings(a []string, x string) int 同上,只是数据类型不同
func Search(n int, f func(int) bool) int 采用二分法搜索找到[0, n)区间内最小的满足f(i)==true的值i。返回找到的索引i,如果没有符合要求的索引,则返回 n。

Example1:[]int 搜索

package mainimport ("fmt""sort"
)func main() {data := sort.IntSlice{9, 5, 3, 25, 1, 5, 64, 45, 21, 48, 55}data.Sort() // 等价于调用 sort.Sort,搜索前需要先排序。fmt.Println(data)x := 5i := data.Search(x) // 等价于调用 sort.SearchIntsfmt.Printf("%v is present at data[%d]\n", x, i)
}

output:
[1 3 5 5 9 21 25 45 48 55 64]
5 is present at data[2]

Example2: []struct 搜索

package mainimport ("fmt""sort"
)type Person struct {Name stringAge  int
}type Persons []Personfunc (s Persons) Len() int           { return len(s) }
func (s Persons) Less(i, j int) bool { return s[i].Age < s[j].Age }
func (s Persons) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }func main() {p := []Person{Person{"Lily", 20}, Person{"Bing", 18}, Person{"Tom", 23}, Person{"Vivy", 16}, Person{"John", 18}}sort.Sort(sort.Reverse(Persons(p))) //sort.Reverse 生成递减序列fmt.Println(p)x := 18i := sort.Search(len(p), func(i int) bool {//如果使用 p[i].Age == x,则找不到索引时返回的是n,而不是列表应该插入的位置,会破坏列表顺序。//在升序列表中使用 p[i].Age >= x,则找不到索引时返回接近x的位置,以保证列表的递增顺序//在降序列表中使用 p[i].Age <= x,则找不到索引时返回接近x的位置,以保证列表的递减顺序return p[i].Age <= x})fmt.Println(i)
}

output:
[{Tom 23} {Lily 20} {Bing 18} {John 18} {Vivy 16}]
2


参考:https://my.oschina.net/evilunix/blog/370676

Golang如何实现排序相关推荐

  1. 鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序

    吐个槽 又是一个不正经取名的排序算法.真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序) 原理 鸡尾酒排序(Cocktail Sor ...

  2. Golang实现选择排序

    @[Golang]Golang实现选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再 ...

  3. Golang(二十一)[排序算法-冒泡排序]

    Golang-排序算法-冒泡排序 1.简介 2.原理 3.操作规则 4.Golang代码 1.升序 2.降序 3.测试 4.完整代码 5.优化 1.原冒泡排序 2.优化后 1.简介 冒泡排序(Bubb ...

  4. golang对map排序

    golang中map元素是随机无序的,所以在对map range遍历的时候也是随机的,不像php中是按顺序.所以如果想按顺序取map中的值,可以采用以下方式: import ("fmt&qu ...

  5. golang 中 map 排序

    golang 中没有专门的 map 排序函数,且 map 默认是无序的,也就是你写入的顺序和打印的顺序是不一样的. m := make(map[string]string, 0) m["on ...

  6. Golang结构体排序

    Golang对结构体字段排序的案例 本案例通过 sort 方法,对产品的 price 字段进行排序,仅供参考... package mainimport ("fmt""s ...

  7. Golang map输出排序

    package mainimport ("fmt""sort" )func main() {fmt.Println("====依据key排序===== ...

  8. golang的int64排序_go语言中的排序讲解

    go语言的排序思路和 c 和 c++ 有些差别. c 默认是对数组进行排序, c++ 是对一个序列进行排序, go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个 slice (分片, ...

  9. Golang 语言的排序、结构体排序

    文章目录 1.前言 2.基本类型切片排序 3.自定义比较器 4.排序任意数据结构 5.小结 1.前言 开发过程中,我们经常需要对元素进行排序,使用 Go 我们可以轻松实现. Go 内置 sort 包中 ...

最新文章

  1. AI一分钟 | 腾讯将成立机器人实验室;机器翻译重大突破:中英翻译已达人类水平
  2. 如何为 Flask Web 应用配置 Nginx
  3. 高速串行总线的设计基础(一)同步时序模型介绍
  4. 170. Leetcode 135. 分发糖果 (贪心算法-两个维度权衡题目)
  5. URLDecoder: Illegal hex characters in escape (%) pattern ...
  6. ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
  7. 草稿 断开式连接 1204
  8. 消除拖延的方法_如何消灭拖延症,并彻底消除想法
  9. Python程序设计语言基础05:函数和代码复用
  10. 简单类名转为class_13 网页各区域div的常见类名
  11. 记录一次苏宁电商延保服务的体验
  12. 【深度优先搜索】复原IP地址
  13. 桃李的修行小结【转】
  14. 使用TS开发小程序中遇到的问题
  15. archlinux安装
  16. 服务器sas卡的作用,英特尔IOP34x处理器介绍
  17. (附源码)计算机毕业设计ssm爱音乐网站
  18. python compare()_Python Decimal compare()用法及代码示例
  19. 节点表征学习[GCN、GAT]
  20. 男人写手账哪来那么的麻烦?

热门文章

  1. 【联邦学习FATE框架实战】(二)用FATE从零开始实现横向逻辑回归
  2. 谷歌浏览器linux,windows下载
  3. python人工智能应用实例_90后博士说,从Python到人工智能只差这35个趣味案例,越学越有趣...
  4. 在Visual Studio项目中根据系统平台自动引用32或64位的DLL
  5. 用edge调试安卓或者手机app的样式
  6. USACO-The Castle
  7. 今天兼职的那份工作,安排了休息
  8. 运维入门之CPU平均负载及问题排查
  9. 如何批量添加阿里巴巴图标 iconfont
  10. 如何批量生成Flattermarken条码