go语言-排序的使用

本文介绍常用类型的排序方法

主要内容

  1. 字符串切片、整型切片与浮点型切片的排序

  2. 逆序排序

  3. 自定义类型的排序

  4. 对已排序的切片使用sort.search()进行查找指定元素

字符串切片排序与逆序

Go 复制代码
	// 定义一个字符串切片
	strSlice := []string{"golang", "python", "C++", "C", "java", "typescript", "javascript"}
	// 方法一:使用sort包的Strings()函数对字符串切片进行排序
	sort.Strings(strSlice)
	fmt.Printf("排序后: %v\n", strSlice)

	// 方法二:使用sort.StringSlice类型,将原字符串切片放入sort.StringSlice类型切片中,再用sort.Sort()进行排序
	sss := sort.StringSlice{}
	for _, v := range strSlice {
		sss = append(sss, v)
	}
	sort.Sort(sss)
	fmt.Printf("排序后: %v\n", sss)

	// 对字符串逆序
	sort.Sort(sort.Reverse(sss))
	fmt.Printf("逆序排序后: %v\n", sss)

整型和浮点型切片排序

Go 复制代码
	// 定义一个整型切片
	intSlice := []int{2, 8, 4, 6, 3}

	// 使用sort.Ints()函数,直接对整型切片排序
	sort.Ints(intSlice)
	fmt.Printf("排序后: %v\n", intSlice)

	// 定义一个浮点数切片
	floatSlice := []float64{2.1, 8.1, 5.1, 4.1, 3.1}

	// 使用sort.Float64s()函数,直接对浮点数切片排序
	sort.Float64s(floatSlice)
	fmt.Printf("排序后: %v\n", floatSlice)

自定义类型的排序

Go 复制代码
// 定义一个student类型
type student struct {
	name  string
	age   int
	score int
}

// 定义一个切片类型
type studentGroupt []student


// 为了使用sort.Sort()接口对自定义类型进行排序,需要实现下面三方方法
func (s studentGroupt) Len() int { return len(s) }

func (s studentGroupt) Less(i, j int) bool {
	// 按分数排序从低到高排序
	return s[i].score < s[j].score

}

func (s studentGroupt) Swap(i, j int) { s[i], s[j] = s[j], s[i] }


func main(){

    sg := studentGroupt{student{
		name:  "xianwei",
		age:   39,
		score: 80,
	}, student{
		name:  "qiuyue",
		age:   36,
		score: 70,
	}, student{
		name:  "xianjun",
		age:   27,
		score: 100,
	}, student{
		name:  "xianjun2",
		age:   27,
		score: 98,
	}}

	sort.Sort(sg)
	fmt.Printf("排序后: %v\n", sg)
}

使用sort.search()进行查找

Search 常用于在一个已排序的,可索引的数据结构中寻找索引为 i 的值 x,例如数组或切片。这种情况下,实参 f,一般是一个闭包,会捕获所要搜索的值,以及索引并排序该数据结构的方式。

为了查找某个值,而不是某一范围的值时,如果slice以升序排序,则 f func中应该使用>=,如果slice以降序排序,则应该使用<=.

Go 复制代码
// 整型切片使用sort.Serarch()查找指定元素
    si := sort.IntSlice{2, 8, 4, 6, 3}

	sort.Sort(si)
	fmt.Printf("排序后:%v\n", si)

	target := 5
	index := sort.Search(len(si), func(i int) bool {
        // 找到后退出
		return si[i] >= target
	})

	if index < len(si) && target == si[index] {
		fmt.Println("found, index is ", index)
	} else {
		fmt.Println("not found")
	}



// 自定义类型切片使用sort.Serarch()查找指定元素

    sort.Sort(sg)
	fmt.Printf("排序后: %v\n", sg)

	target2 := student{
		name:  "qiuyue",
		age:   36,
		score: 70,
	}
	// 对自定义类型,按其余某个可比较的年龄字段来查找
	index2 := sort.Search(len(sg), func(i int) bool {
		return sg[i].age >= target2.age
	})
	if index2 < len(si) && target2.age == sg[index2].age {
		fmt.Println("found, index is ", index2)
	} else {
		fmt.Println("not found")
	}
相关推荐
showyoui15 分钟前
Python 闭包(Closure)实战总结
开发语言·python
今天背单词了吗98020 分钟前
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·数据结构·笔记·算法
Eiceblue22 分钟前
使用 C# 发送电子邮件(支持普通文本、HTML 和附件)
开发语言·c#·html·visual studio
小小小小王王王27 分钟前
hello判断
开发语言·c#
苦夏木禾1 小时前
js请求避免缓存的三种方式
开发语言·javascript·缓存
超级土豆粉2 小时前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
wei_shuo3 小时前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
熊猫钓鱼>_>3 小时前
用Python解锁图像处理之力:从基础到智能应用的深度探索
开发语言·图像处理·python
GO兔3 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
好开心啊没烦恼3 小时前
Python 数据分析:numpy,抽提,整数数组索引与基本索引扩展(元组传参)。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy·pandas