参考博客:https://studygolang.com/articles/13173

基本类型排序

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "sort"
  6. )
  7.  
  8. func main() {
  9. intList := []int{, , , , , , , , , }
  10. floatList := []float64{4.2, 5.9, 12.3, 10.0, 50.4, 99.9, 31.4, 27.81828, 3.14}
  11. stringList := []string{"a", "c", "b", "d", "f", "i", "z", "x", "w", "y"}
  12.  
  13. sort.Sort(sort.IntSlice(intList))
  14. sort.Sort(sort.Float64Slice(floatList))
  15. sort.Sort(sort.StringSlice(stringList))
  16.  
  17. fmt.Printf("%v\n%v\n%v\n", intList, floatList, stringList)
  18.  
  19. sort.Sort(sort.Reverse(sort.IntSlice(intList)))
  20. sort.Sort(sort.Reverse(sort.Float64Slice(floatList)))
  21. sort.Sort(sort.Reverse(sort.StringSlice(stringList)))
  22.  
  23. fmt.Printf("%v\n%v\n%v\n", intList, floatList, stringList)
  24. }

结构体排序

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "sort"
  6. )
  7.  
  8. type Person struct {
  9. Name string // 姓名
  10. Age int // 年纪
  11. }
  12.  
  13. // 按照 Person.Age 从大到小排序
  14. type PersonSlice []Person
  15.  
  16. func (a PersonSlice) Len() int { // 重写 Len() 方法
  17. return len(a)
  18. }
  19. func (a PersonSlice) Swap(i, j int) { // 重写 Swap() 方法
  20. a[i], a[j] = a[j], a[i]
  21. }
  22. func (a PersonSlice) Less(i, j int) bool { // 重写 Less() 方法, 从小到大排序
  23. return a[i].Age < a[j].Age
  24. }
  25.  
  26. func main() {
  27. people := []Person{
  28. {"zhang san", },
  29. {"li si", },
  30. {"wang wu", },
  31. {"zhao liu", },
  32. }
  33.  
  34. fmt.Println(people)
  35.  
  36. sort.Sort(PersonSlice(people)) // 按照 Age 的升序排序
  37. fmt.Println(people)
  38.  
  39. sort.Sort(sort.Reverse(PersonSlice(people))) // 按照 Age 的降序排序
  40. fmt.Println(people)
  41.  
  42. }

最小堆

heap是常用的实现优先队列的方法。heap包对任意实现了heap接口的类型提供堆操作。堆结构继承自sort.Interface, 而sort.Interface,需要实现三个方法:Len() int / Less(i, j int) bool / Swap(i, j int) 再加上堆接口定义的两个方法:Push(x interface{}) / Pop() interface{}。故只要实现了这五个方法,便定义了一个堆。
  1. package main
  2.  
  3. import (
  4. "container/heap"
  5. "fmt"
  6. )
  7.  
  8. type IntHeap []int
  9.  
  10. func (h IntHeap) Len() int { return len(h) }
  11. func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
  12. func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
  13.  
  14. func (h *IntHeap) Push(x interface{}) {
  15. *h = append(*h, x.(int))
  16. }
  17.  
  18. func (h *IntHeap) Pop() interface{} {
  19. old := *h
  20. n := len(old)
  21. x := old[n-]
  22. *h = old[ : n-]
  23. return x
  24. }
  25.  
  26. func main() {
  27. h := &IntHeap{, , , , , , , }
  28. heap.Init(h)
  29. heap.Push(h, )
  30. fmt.Printf("minimum: %d\n", (*h)[])
  31. for h.Len() > {
  32. fmt.Printf("%d ", heap.Pop(h))
  33. }
  34. }

优先队列

  1. package main
  2.  
  3. import (
  4. "container/heap"
  5. "fmt"
  6. )
  7.  
  8. type stu struct {
  9. name string
  10. age int
  11. }
  12. type Stu []stu
  13.  
  14. func (t *Stu) Len() int {
  15. return len(*t) //
  16. }
  17.  
  18. func (t *Stu) Less(i, j int) bool {
  19. return (*t)[i].age < (*t)[j].age
  20. }
  21.  
  22. func (t *Stu) Swap(i, j int) {
  23. (*t)[i], (*t)[j] = (*t)[j], (*t)[i]
  24. }
  25.  
  26. func (t *Stu) Push(x interface{}) {
  27. *t = append(*t, x.(stu))
  28. }
  29.  
  30. func (t *Stu) Pop() interface{} {
  31. n := len(*t)
  32. x := (*t)[n-]
  33. *t = (*t)[:n-]
  34. return x
  35. }
  36.  
  37. func main() {
  38. student := &Stu{{"Amy", }, {"Dav", }, {"Spo", }, {"Reb", }}
  39. heap.Init(student)
  40. one := stu{"hund", }
  41. heap.Push(student, one)
  42. for student.Len() > {
  43. fmt.Printf("%v\n", heap.Pop(student))
  44. }
  45.  
  46. }

golang优先队列的更多相关文章

  1. golang实现的简单优先队列

    下面是golang实现的简单优先队列,参考信息可以查看https://golang.org/pkg/container/heap/或者https://golang.google.cn/pkg/cont ...

  2. 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序

    优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...

  3. 堆 堆排序 优先队列 图文详解(Golang实现)

    引入 在实际应用中,我们经常需要从一组对象中查找最大值或最小值.当然我们可以每次都先排序,然后再进行查找,但是这种做法效率很低.哪么有没有一种特殊的数据结构,可以高效率的实现我们的需求呢,答案就是堆( ...

  4. 面试经典算法:优先队列,最大堆,堆排序,左偏树Golang实现

    堆排序 使用优先队列-最小/最大堆可实现. 优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小的数值(获取数值,并且删除).优先队列可以用二叉树来实现,我们称这种为二叉堆. 最小堆 ...

  5. golang中container/heap包源码分析

    学习golang难免需要分析源码包中一些实现,下面就来说说container/heap包的源码 heap的实现使用到了小根堆,下面先对堆做个简单说明 1. 堆概念 堆是一种经过排序的完全二叉树,其中任 ...

  6. 数据流中的第k大元素的golang实现

    设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中 ...

  7. golang模拟动态高优先权优先调度算法

    实验二  动态高优先权优先调度 实验内容 模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下: 设置进程体:进 ...

  8. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

  9. 数据结构和算法(Golang实现)(1)简单入门Golang-前言

    数据结构和算法在计算机科学里,有非常重要的地位.此系列文章尝试使用 Golang 编程语言来实现各种数据结构和算法,并且适当进行算法分析. 我们会先简单学习一下Golang,然后进入计算机程序世界的第 ...

随机推荐

  1. 关于Session的概念和测试点

    Session概要 Session 是用于保持状态的基于 Web 服务器的方法,在 Web 服务器上保持用户的状态信息供在任何时间从任何页访问. Session 允许通过将对象存储在 Web 服务器的 ...

  2. ubuntu搭建discuz论坛

    a.安装mysql database 1.安装mysql服务端 sudo apt-get install mysql-server  (在此过程中要求为mysql的root用户设置一个密码) 2.安装 ...

  3. 2016年蓝桥杯B组C/C++省赛(预选赛)试题

    2016年蓝桥杯B组C/C++ 点击查看2016年蓝桥杯B组省赛题目解析(答案) 第一题:煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成 ...

  4. 【安装】Microsoft SQL Server的安装

    数据库版本:2012 系统环境:windows 7 一.安装 依次选择“安装->全新 SQL Server 独立安装或向现有安装添加功能”;点“确定” 选择版本,推荐标准版,这里是直接输入序列号 ...

  5. Unity3D学习笔记(十七):IK动画、粒子系统和塔防

    新动画系统: 反向动力学动画(IK功能): 魔兽世界(头部动画),神秘海域(手部动画),人类一败涂地(手部动画) 如何启用(调整) 1.必须是新动画系统Animator 设置头.手.肘的目标点 2.动 ...

  6. POJ 2965 The Pilots Brothers' refrigerator (枚举+BFS+位压缩运算)

    http://poj.org/problem?id=2965 题意: 一个4*4的矩形,有'+'和'-'两种符号,每次可以转换一个坐标的符号,同时该列和该行上的其他符号也要随之改变.最少需要几次才能全 ...

  7. 【Django】【六】接口自动化测试框架

    我的源码地址:https://github.com/woshixiaoyu202017/djangoTest 详细构建步骤如下 1. 生成新的测试数据库的数据库表结构guest_test 2. 数据库 ...

  8. Enumerable扩展方法

    主要记录一些平时在工作中用到操作Enumerable的常用方法 /// <summary> /// The i enumerable extension. /// </summary ...

  9. Phpstorm配置scss不生成缓存

    --no-cache 加上这个,就不会生成 .sass-cache 文件夹了.

  10. python导包显示No module named XXX问题

    最近用sublime text写python脚本,在导包是一直显示No module named XXX. 问题描述: 首先文件夹的目录结构如下: count.py文件,代码如下: #coding=u ...