golang sort包介绍

本文介绍了Go语言中的sort包,包括基本排序功能和自定义比较函数的排序,以及二分查找的方法,展示了如何使用sort包进行稳定和不稳定的排序,并提供了通用的查找操作。
摘要由CSDN通过智能技术生成

sort包提供了对集合排序和查找的基础函数集,主要有两部分:sort和search

一、sort

    1. sort对外提供了对集合排序的方法,排序算法的实现是快速排序、堆排序和插入排序的组合,最简单常见的方法是:

func Ints(a []int) //对[]int排序,快排、堆排序和插入排序组合使用,不稳定

func Float64s(a []float64)

func Strings(a []string)

 

func IntsAreSorted(a []int) bool //判断[]int是否升序有序

func Float64sAreSorted(a []float64) bool

func StringsAreSorted(a []string) bool

 

    2.进阶一点的是自定义比较函数的排序,有稳定和不稳定两种,较为通用:

func Slice(slice interface{}, less func(i, j int) bool) //第一个参数必须为Slice, less函数需要在slice[i]<slice[j]时返回true,不稳定

func SliceStable(slice interface{}, less func(i, j int) bool) //同上,稳定

 

    3.最为通用的是:

func Sort(data Interface) //对data排序,不稳定, O(n*log(n))比较和O(n*log(n))次交换

func Stable(data Interface) //对data排序,稳定,O(n*log(n))比较和O(n*log(n)*log(n))次交换

 

// 其中data需要实现以下接口

type Interface interface {

   // Len is the number of elements in the collection.

   Len() int

   // 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)

}

 

二、search

    1. search对外提供了二分查找的方法,最简单常见的方法是:

func SearchInts(a []int, x int) int //在a中查找x, a必须为升序有序,返回值i满足(i < len(data) && a[i] == x)表示找到,否则没找到

func SearchFloat64s(a []float64, x float64) int

func SearchStrings(a []string, x string) int

    2.通用的查找,需要自定义比较函数:

func Search(n int, f func(int) bool) int // n是要查找的集合长度,函数f返回true时,二分向左侧进行;返回false时,二分向右侧进行

 

// example

func t_search() {

   ints := []int{1,4,6,8,9}

   target := 5

   i := sort.Search(len(ints), func(i int) bool { // 存在时返回第一次出现的index,不存在时返回要插入的位置,比如查找4返回1,查找5返回2,查找9返回4,查找11返回5

      return ints[i] >= target   //如果是降序序列,条件为:ints[i] <= target

   })

   if i < len(ints) && ints[i] == target {

      fmt.Println("found, index:", i)

   }else {

      fmt.Println("not found")

   }

}

    3.Search的源码

func Search(n int, f func(int) bool) int {

   // Define f(-1) == false and f(n) == true.

   // Invariant: f(i-1) == false, f(j) == true.

   i, j := 0, n

   for i < j {

      h := int(uint(i+j) >> 1// avoid overflow when computing h

      // i ≤ h < j

      if !f(h) {

         i = h + 1 // preserves f(i-1) == false

      else {

         j = h // preserves f(j) == true

      }

   }

   // i == j, f(i-1) == false, and f(j) (= f(i)) == true  =>  answer is i.

   return i

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值