十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Go 语言提供了sort包,可以用来排序。但需要排序的对象必须实现sort.Interface接口。
创新互联专业为企业提供淮北网站建设、淮北做网站、淮北网站设计、淮北网站制作等企业网站建设、网页设计与制作、淮北企业网站模板建站服务,10多年淮北做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
sort.Interface 定义:
现在需要对一群人按年龄升序排序,首先定义Human类型
然后定义集合类型Humans
Humans 实现sort.Interface接口
升序排序
降序排序
Go语言标准库中提供了sort包对整型,浮点型,字符串型切片进行排序,检查一个切片是否排好序,使用二分法搜索函数在一个有序切片中搜索一个元素等功能。
关于sort包内的函数说明与使用,请查看
在这里简单讲几个sort包中常用的函数
在Go语言中,对字符串的排序都是按照字节排序,也就是说在对字符串排序时是区分大小写的。
二分搜索算法
Go语言中提供了一个使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比较㏒₂n个元素,其中n为切片中元素的总数。
sort.Search(size,fn)函数接受两个参数:所处理的切片的长度和一个将目标元素与有序切片的元素相比较的函数,该函数是一个闭包,如果该有序切片是升序排列,那么在判断时使用 有序切片的元素 = 目标元素。该函数返回一个int值,表示与目标元素相同的切片元素的索引。
在切片中查找出某个与目标字符串相同的元素索引
Go 提供了 container/heap 这个包来实现堆的操作。堆实际上是一个树的结构,每个元素的值都是它的子树中最小的,因此根节点 index = 0 的值是最小的,即最小堆。
堆也是实现优先队列 Priority Queue 的常用方式。
堆中元素的类型需要实现 heap.Interface 这个接口:
其中 sort.Interface 包括 Len() , Less , Swap 方法:
一个完整的示例如下:
注意注释中的一句话 Push 和 Pop 方法需要使用指针,因为它们会修改 slice 的长度,而不仅仅只内容 。
Leetcode 692. Top K Frequent Words 也可以使用 Go 语言通过构造 PriorityQueue 来实现:
快速排序是大多数语言内置 sort 函数的默认实现方式,简单可分为两路排序和三路排序,我在相关资料中,发现两路排序也有多种实现方式。
两路快排的逻辑
这个名词来自于 b 站的评论,这个快排思路很容易理解,非常适合入门
大体上和第一个版本差不多,但是函数更加简洁了,
这个版本是所有快速排序中,看起来比较难以理解,只有一个指针,从左到右滑动,设计非常巧妙。
这边测试了四种情况,中间值最优。
用了3个指针,表示小于,等于,大于三个部分,从而减少相等的数在其中来回交换。
由此可见快速排序是一种不稳定的排序,对于数据本身是有要求,对于 pivot 如何取也是有要求,属于经验取值了,如果对于源数据是逆序的情形,快排会退化成冒泡。
2021年03月18日22:24 更新