golang 写个快速排序快速排序是大多数语言内置 sort 函数的默认实现方式,简单可分为两路排序和三路排序,我在相关资料中,发现两路排序也有多种实现方式 。
两路快排的逻辑
这个名词来自于 b 站的评论,这个快排思路很容易理解,非常适合入门
大体上和第一个版本差不多 , 但是函数更加简洁了,
这个版本是所有快速排序中,看起来比较难以理解 , 只有一个指针,从左到右滑动 , 设计非常巧妙 。
这边测试了四种情况,中间值最优 。
用了3个指针,表示小于,等于,大于三个部分,从而减少相等的数在其中来回交换 。
由此可见快速排序是一种不稳定的排序,对于数据本身是有要求 , 对于 pivot 如何取也是有要求,属于经验取值了,如果对于源数据是逆序的情形,快排会退化成冒泡 。
2021年03月18日22:24 更新
golang标准库之sort 标准库sort实现了4种排序方法,插入排序 、 堆排序 、 快排 和 归并排序 ,但是并没有暴露给用户接口 。sort包会根据数据选择最优的排序方法(其实只使用了3种,归并排序 除外) 。
用户需要实现以下接口才能使用sort包的排序功能 。
对于常用的类型( 整型切片 、 float64切片 、 String切片 ),sort包提供了内置的接口实现
使用举例如下:
举例如下:
golang排序问题求助如果是只有这几个go语言sort的话 go语言sort我们可以考虑自定义一个排序类型
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"
【go语言sort go语言source冒泡排序】"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 idxbLen-1 {return false
}if chr != b[idx] {return chrb[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 : transformGBK 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 网页链接
Golang 实现排序Go 语言提供了sort包go语言sort,可以用来排序 。但需要排序go语言sort的对象必须实现sort.Interface接口 。
sort.Interface 定义:
现在需要对一群人按年龄升序排序go语言sort , 首先定义Human类型
然后定义集合类型Humans
Humans 实现sort.Interface接口
升序排序
降序排序
Go语言 排序与搜索切片Go语言标准库中提供了sort包对整型,浮点型,字符串型切片进行排序,检查一个切片是否排好序,使用二分法搜索函数在一个有序切片中搜索一个元素等功能 。
关于sort包内的函数说明与使用,请查看
在这里简单讲几个sort包中常用的函数
在Go语言中,对字符串的排序都是按照字节排序,也就是说在对字符串排序时是区分大小写的 。
二分搜索算法
Go语言中提供了一个使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比较㏒?n个元素,其中n为切片中元素的总数 。
sort.Search(size,fn)函数接受两个参数:所处理的切片的长度和一个将目标元素与有序切片的元素相比较的函数,该函数是一个闭包,如果该有序切片是升序排列,那么在判断时使用 有序切片的元素 = 目标元素 。该函数返回一个int值 , 表示与目标元素相同的切片元素的索引 。
在切片中查找出某个与目标字符串相同的元素索引
关于go语言sort和go语言source冒泡排序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 鸿蒙系统打王者有怪声,鸿蒙系统打王者有怪声吗
- 关于postgresql安装默认密码的信息
- 生化经营类游戏,小游戏生化
- 解压直播设备,直播解压声音
- 包含windowssp系统的词条
- linux所有命令集合,linux60个命令
- 什么是鸿蒙界面,鸿蒙系统操作界面首度亮相
- erp仓储系统免费,erp仓储管理系统
- windows系统数的简单介绍