golang基础-排序sort

Posted 进击的小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang基础-排序sort相关的知识,希望对你有一定的参考价值。

文章目录

简单排序

基本类型 int、float64、string 的排序
[]int、[]float64、[]string排序



	intList := [] int 2, 4, 3, 5, 7
	float8List := [] float64 4.2, 5.9, 12.3, 10.0
	stringList := [] string "a", "c", "b", "w", "y"

	sort.Ints(intList)
	sort.Float64s(float8List)
	sort.Strings(stringList)

	fmt.Printf("%v\\n%v\\n%v\\n", intList, float8List, stringList)


	intListt := [] int 2, 4, 3, 5, 7, 6, 9, 8, 1, 0
	float8Listt := [] float64 4.2, 5.9, 12.3, 10.0, 50.4, 99.9, 31.4, 27.81828, 3.14
	stringListt := [] string "a", "c", "b", "d", "f", "i", "z", "x", "w", "y"

	sort.Sort(sort.Reverse(sort.IntSlice(intListt)))
	sort.Sort(sort.Reverse(sort.Float64Slice(float8Listt)))
	sort.Sort(sort.Reverse(sort.StringSlice(stringListt)))

	fmt.Printf("%v\\n%v\\n%v\\n", intListt, float8Listt, stringListt)

输出如下:

[2 3 4 5 7]
[4.2 5.9 10 12.3]
[a b c w y]
[9 8 7 6 5 4 3 2 1 0]
[99.9 50.4 31.4 27.81828 12.3 10 5.9 4.2 3.14]
[z y x w i f d c b a]

查询

我们还可以查询是否存在

ints := []int5, 2, 6, 3, 1, 4,4
	ipos := sort.SearchInts(ints, 43)
	fmt.Print(ipos,"\\n")

	str:=[]string"a","c","b"
	sp:=sort.SearchStrings(str,"cdd")
	sp1:=sort.SearchStrings(str,"b")
	fmt.Print(sp,sp1)

结果输出

7
3 1

自定义排序

我们先看一个简单的自定义排序
通过看sort源码可以看到

type Interface interface 
	// Len is the number of elements in the collection.
	Len() int
	// Less reports whether the element with
	// index i should sort before the element with index j.
	Less(i, j int) bool
	// Swap swaps the elements with indexes i and j.
	Swap(i, j int)

下面到例子,我们可以为sort.Sort函数,提供一个实现了接口的struct

doubles := []float643.5, 4.2, 8.9, 100.98, 20.14, 79.32
sort.Sort(Reversesort.Float64Slice(doubles))    // float64 逆序排序
fmt.Print(doubles)
type Reverse struct 
	sort.Interface    // 这样, Reverse 可以接纳任何实现了 sort.Interface (包括 Len, Less, Swap 三个方法) 的对象

func (r Reverse) Less(i, j int) bool 
	return r.Interface.Less(j, i)


输出如下:

[100.98 79.32 20.14 8.9 4.2 3.5]

结构体类型的排序(一)


	people := [] Person
		"zhang san", 12,
		"li si", 30,
		"wang wu", 52,
		"zhao liu", 26,
	

	fmt.Println(people)

	sort.Sort(PersonSlice(people))    // 按照 Age 的逆序排序
	fmt.Println(people)

	sort.Sort(sort.Reverse(PersonSlice(people)))    // 按照 Age 的升序排序
	fmt.Println(people)

type PersonSlice [] Person

type Person struct 
	Name string    // 姓名
	Age  int    // 年纪



func (a PersonSlice) Len() int     // 重写 Len() 方法
	return len(a)

func (a PersonSlice) Swap(i, j int)     // 重写 Swap() 方法
	a[i], a[j] = a[j], a[i]

func (a PersonSlice) Less(i, j int) bool     // 重写 Less() 方法, 从大到小排序
	return a[j].Age < a[i].Age

代码输出如下:

[zhang san 12 li si 30 wang wu 52 zhao liu 26]
[wang wu 52 li si 30 zhao liu 26 zhang san 12]
[zhang san 12 zhao liu 26 li si 30 wang wu 52]

结构体类型的排序(二)

方法 1 的缺点是 : 根据 Age 排序需要重新定义 PersonSlice 方法,绑定 Len 、 Less 和 Swap 方法, 如果需要根据 Name 排序, 又需要重新写三个函数; 如果结构体有 4 个字段,有四种类型的排序,那么就要写 3 × 4 = 12 个方法, 即使有一些完全是多余的, O__O"… 仔细思量一下,根据不同的标准 Age 或是 Name, 真正不同的体现在 Less 方法上,所以, me 们将 Less 抽象出来, 每种排序的 Less 让其变成动态的,比如下面一种方法。

people := [] Person
		"zhang san", 12,
		"li si", 30,
		"wang wu", 52,
		"zhao liu", 26,
	

	fmt.Println(people)

	sort.Sort(PersonWrapperpeople, func(p, q *Person) bool 
		return q.Age < p.Age // Age 递减排序
	)

	fmt.Println(people)
	sort.Sort(PersonWrapperpeople, func(p, q *Person) bool 
		return p.Name < q.Name // Name 递增排序
	)
	fmt.Println(people)

type Person struct 
	Name string // 姓名
	Age  int    // 年纪


type PersonWrapper struct 
	people [] Person
	by     func(p, q *Person) bool


func (pw PersonWrapper) Len() int  // 重写 Len() 方法
	return len(pw.people)

func (pw PersonWrapper) Swap(i, j int)  // 重写 Swap() 方法
	pw.people[i], pw.people[j] = pw.people[j], pw.people[i]

func (pw PersonWrapper) Less(i, j int) bool  // 重写 Less() 方法
	return pw.by(&pw.people[i], &pw.people[j])


输出如下:

[zhang san 12 li si 30 wang wu 52 zhao liu 26]
[wang wu 52 li si 30 zhao liu 26 zhang san 12]
[li si 30 wang wu 52 zhang san 12 zhao liu 26]

以上是关于golang基础-排序sort的主要内容,如果未能解决你的问题,请参考以下文章

golang基础-排序sort

golang基础-排序sort

转载 python sortsorted高级排序技巧

Linux基础:sort命令总结

Golang语言LeetCode1122. Relative Sort Array

R语言使用sort.list函数对向量数据进行排序(默认升序排序)返回排序后的对应索引值