Go语言---sort 包中sort.Ints()、sort.Strings()、sort.Slice()、sort.SliceStable()、sort.Search()方法详解

在每一种编程语言中,都会涉及到排序操作。而在Go语言中,其中内置的 sort 包中提供了根据一些排序函数来对任何序列进行排序的功能。通过这个包中的一些方法,我们可以对一些基本的可以比较大小的类型的切片进行排序,也可以通过实现排序接口的几个特定方法实现自定义排序。

sort.Ints()、sort.Strings()

  • sort.Ints --针对整型
  • sort.Strings --字符串
    默认从小到大

例如

package main

import (
	"fmt"
	"sort"
)

func main() {
	s := []int{4, 2, 3, 1}
	sort.Ints(s)
	fmt.Println(s)

	str := []string{"ddd", "bbb", "ccc"}
	sort.Strings(str)
	fmt.Println(str)
}

在这里插入图片描述

sort.Slice()

Go 1.8之后的版本,在 sort 包中提供了 sort.Slice() ,它使用一个用户提供的函数来对序列进行排序,函数类型为 func(i, j int) bool,其中参数 i, j 是序列中的索引。与C++中的自定义排序有些类似:

bool cmd(Student a, Student b) {
    if (a.age < b.age)
        return true;
    return false;
}

此排序不能保证是稳定的:相等的元素可能会从它们的原始顺序颠倒过来。

例如:

package main

import (
	"fmt"
	"sort"
)

func main() {
	Student := []struct {
		Name string
		Age  int
	}{
		{"zhangsan", 23},
		{"wangwu", 2},
		{"lili", 18},
		{"lisi", 2},
	}

	sort.Slice(Student, func(i, j int) bool {
		return Student[i].Age < Student[j].Age
	})
	fmt.Println(Student)
}

在这里插入图片描述

sort.SliceStable()

在排序切片时会保留相等元素的原始顺序。

例如:

package main

import (
	"fmt"
	"sort"
)

func main() {
	Student := []struct {
		Name string
		Age  int
	}{
		{"zhangsan", 23},
		{"wangwu", 2},
		{"lili", 18},
		{"lisi", 2},
	}

	// 用 age 排序,年龄相等的元素保持原始顺序
	sort.SliceStable(Student, func(i, j int) bool {
		return Student[i].Age < Student[j].Age
	})
	fmt.Println(Student)

	sort.SliceStable(Student, func(i, j int) bool {
		return Student[i].Age > Student[j].Age
	})
	fmt.Println(Student)

	sort.Slice(Student, func(i, j int) bool {
		return Student[i].Age < Student[j].Age
	})
	fmt.Println(Student)
}

在这里插入图片描述

sort.Search()

语法

index := sort.Search(n int,f func(i int) bool) int

该函数使用二分查找的方法,会从[0, n)中取出一个值index,index为[0, n)中最小的使函数f(index)为True的值,并且f(index+1)也为True。如果无法找到该index值,则该方法为返回n。

实例

在数组中,找到第一个大于3的下标。

package main

import (
	"fmt"
	"sort"
)

func main() {
	a := []int{1, 2, 3, 4, 5}
	d := sort.Search(len(a), func(i int) bool { return a[i] >= 3 })
	fmt.Println(d)
}

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值