Go语言 排序与搜索切片

Python011

Go语言 排序与搜索切片,第1张

Go语言标准库中提供了sort包对整型,浮点型,字符串型切片进行排序,检查一个切片是否排好序,使用二分法搜索函数在一个有序切片中搜索一个元素等功能。

关于sort包内的函数说明与使用,请查看 https://godoc.org/sort

在这里简单讲几个sort包中常用的函数

在Go语言中,对字符串的排序都是按照字节排序,也就是说在对字符串排序时是区分大小写的。

二分搜索算法

Go语言中提供了一个使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比较㏒₂n个元素,其中n为切片中元素的总数。

sort.Search(size,fn)函数接受两个参数:所处理的切片的长度和一个将目标元素与有序切片的元素相比较的函数,该函数是一个闭包,如果该有序切片是升序排列,那么在判断时使用 有序切片的元素 >= 目标元素。该函数返回一个int值,表示与目标元素相同的切片元素的索引。

在切片中查找出某个与目标字符串相同的元素索引

如果是只有这几个的话 我们可以考虑自定义一个排序类型

func TestSort(t *testing.T) {

data := []string{"三级", "一级", "二级"}

rule := map[string]int{

"一级": 1,

"二级": 2,

"三级": 3,

}

self := &SelfSort{

Rule: rule,

Data: data,

}

sort.Sort(self)

fmt.Println(self.Data)

}

type SelfSort struct {

Rule map[string]int

Data []string

}

func (p SelfSort) Len() int           { return len(p.Data) }

func (p SelfSort) Less(i, j int) bool { return p.Rule[p.Data[i]] <p.Rule[p.Data[j]] }

func (p SelfSort) Swap(i, j int)      { p.Data[i], p.Data[j] = p.Data[j], p.Data[i] }

如过很多 就是真的要比较中文的话, 就用这种

package mainimport (    "bytes"

"fmt"

"io/ioutil"

"sort"

"golang.org/x/text/encoding/simplifiedchinese"

"golang.org/x/text/transform")//ByPinyin is customized sort interface to sort string by Chinese PinYintype ByPinyin []stringfunc (s ByPinyin) Len() int      { return len(s) }func (s ByPinyin) Swap(i, j int) { s[i], s[j] = s[j], s[i] }func (s ByPinyin) Less(i, j int) bool {

a, _ := UTF82GBK(s[i])

b, _ := UTF82GBK(s[j])

bLen := len(b)    for idx, chr := range a {        if idx >bLen-1 {            return false

}        if chr != b[idx] {            return chr <b[idx]

}

}    return true}//UTF82GBK : transform UTF8 rune into GBK byte arrayfunc UTF82GBK(src string) ([]byte, error) {

GB18030 := simplifiedchinese.All[0]    return ioutil.ReadAll(transform.NewReader(bytes.NewReader([]byte(src)), GB18030.NewEncoder()))

}//GBK2UTF8 : transform  GBK byte array into UTF8 stringfunc GBK2UTF8(src []byte) (string, error) {

GB18030 := simplifiedchinese.All[0]

bytes, err := ioutil.ReadAll(transform.NewReader(bytes.NewReader(src), GB18030.NewDecoder()))    return string(bytes), err

}func main() {

b := []string{"哈", "呼", "嚯", "ha", ","}

sort.Strings(b)    //output: [, ha 呼 哈 嚯]

fmt.Println("Default sort: ", b)

sort.Sort(ByPinyin(b))    //output: [, ha 哈 呼 嚯]

fmt.Println("By Pinyin sort: ", b)

}

copy from 网页链接

选择排序提高了冒泡排序的性能,它每遍历一次列表只交换一次数据,即进行一次遍历时找 到最大的项,完成遍历后,再把它换到正确的位置。和冒泡排序一样,第一次遍历后,最大的数 据项就已归位,第二次遍历使次大项归位。这个过程持续进行,一共需要 n-1 次遍历来排好 n 个数 据,因为最后一个数据必须在第 n-1 次遍历之后才能归位。