Golang如何实现排序
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如何实现排序相关推荐
- 鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序
吐个槽 又是一个不正经取名的排序算法.真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序) 原理 鸡尾酒排序(Cocktail Sor ...
- Golang实现选择排序
@[Golang]Golang实现选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再 ...
- Golang(二十一)[排序算法-冒泡排序]
Golang-排序算法-冒泡排序 1.简介 2.原理 3.操作规则 4.Golang代码 1.升序 2.降序 3.测试 4.完整代码 5.优化 1.原冒泡排序 2.优化后 1.简介 冒泡排序(Bubb ...
- golang对map排序
golang中map元素是随机无序的,所以在对map range遍历的时候也是随机的,不像php中是按顺序.所以如果想按顺序取map中的值,可以采用以下方式: import ("fmt&qu ...
- golang 中 map 排序
golang 中没有专门的 map 排序函数,且 map 默认是无序的,也就是你写入的顺序和打印的顺序是不一样的. m := make(map[string]string, 0) m["on ...
- Golang结构体排序
Golang对结构体字段排序的案例 本案例通过 sort 方法,对产品的 price 字段进行排序,仅供参考... package mainimport ("fmt""s ...
- Golang map输出排序
package mainimport ("fmt""sort" )func main() {fmt.Println("====依据key排序===== ...
- golang的int64排序_go语言中的排序讲解
go语言的排序思路和 c 和 c++ 有些差别. c 默认是对数组进行排序, c++ 是对一个序列进行排序, go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个 slice (分片, ...
- Golang 语言的排序、结构体排序
文章目录 1.前言 2.基本类型切片排序 3.自定义比较器 4.排序任意数据结构 5.小结 1.前言 开发过程中,我们经常需要对元素进行排序,使用 Go 我们可以轻松实现. Go 内置 sort 包中 ...
最新文章
- AI一分钟 | 腾讯将成立机器人实验室;机器翻译重大突破:中英翻译已达人类水平
- 如何为 Flask Web 应用配置 Nginx
- 高速串行总线的设计基础(一)同步时序模型介绍
- 170. Leetcode 135. 分发糖果 (贪心算法-两个维度权衡题目)
- URLDecoder: Illegal hex characters in escape (%) pattern ...
- ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
- 草稿 断开式连接 1204
- 消除拖延的方法_如何消灭拖延症,并彻底消除想法
- Python程序设计语言基础05:函数和代码复用
- 简单类名转为class_13 网页各区域div的常见类名
- 记录一次苏宁电商延保服务的体验
- 【深度优先搜索】复原IP地址
- 桃李的修行小结【转】
- 使用TS开发小程序中遇到的问题
- archlinux安装
- 服务器sas卡的作用,英特尔IOP34x处理器介绍
- (附源码)计算机毕业设计ssm爱音乐网站
- python compare()_Python Decimal compare()用法及代码示例
- 节点表征学习[GCN、GAT]
- 男人写手账哪来那么的麻烦?