1.冒泡排序

func bubble_sort(li []int) {for i := 0; i < len(li)-1; i++ {exchange := falsefor j := 0; j < len(li)-i-1; j++ {if li[j] > li[j+1] {li[j], li[j+1] = li[j+1], li[j]exchange = true}}if !exchange {return}}
}

2.选择排序

func select_sort(li []int) {for i := 0; i < len(li)-1; i++ {pos := ifor j := i + 1; j < len(li); j++ {if li[pos] > li[j] {pos = j}}li[i], li[pos] = li[pos], li[i]}
}

3.插入排序

func insert_sort(li []int) {for i := 1; i < len(li); i++ {tmp := li[i]j := i - 1for j >= 0 && tmp < li[j] {li[j+1] = li[j]j --}li[j+1] = tmp}
}

4.希尔排序

func shell_sort(li []int) {for gap := len(li) / 2; gap > 0; gap /= 2 {for i := gap; i < len(li); i++ {tmp := li[i]j := i - gapfor j >= 0 && tmp < li[j] {li[j+gap] = li[j]j -= gap}li[j+gap] = tmp}}
}

5.快速排序

func quick_sort(li []int, left, right int) {if left >= right {return}i := leftj := rightrand.Seed(time.Now().Unix())r := rand.Intn(right-left) + leftli[i], li[r] = li[r], li[i]tmp := li[i]for i < j {for i < j && li[j] >= tmp {j--}li[i] = li[j]for i < j && li[i] <= tmp {i++}li[j] = li[i]}li[i] = tmpquick_sort(li, left, i-1)quick_sort(li, i+1, right)
}

6.堆排序

func sift(li []int, low, high int) {i := lowj := 2*i + 1tmp:=li[i]for j <= high {if j < high && li[j] < li[j+1] {j++}if tmp < li[j] {li[i]  = li[j]i = jj = 2*i + 1} else {break}}li[i] = tmp
}func heap_sort(li []int) {for i := len(li)/2 - 1; i >= 0; i-- {sift(li, i, len(li)-1)}for j := len(li) - 1; j > 0; j-- {li[0], li[j] = li[j], li[0]sift(li, 0, j-1)}
}

7.归并排序

func merge(li []int, left, mid, right int) {i := leftj := mid + 1tmp := []int{}for i <= mid && j <= right {if li[i] <= li[j] {tmp = append(tmp, li[i])i ++} else {tmp = append(tmp, li[j])j ++}}if i <= mid {tmp = append(tmp, li[i:mid+1]...)} else {tmp = append(tmp, li[j:right+1]...)}for k := 0; k < len(tmp); k++ {li[left+k] = tmp[k]}
}func merge_sort(li []int, left, right int) {if left < right {mid := (left + right) / 2merge_sort(li, left, mid)merge_sort(li, mid+1, right)merge(li, left, mid, right)}
}

8.计数排序

func count_sort(li []int) {max_num := li[0]for i := 1; i < len(li); i++ {if max_num < li[i] {max_num = li[i]}}arr := make([]int, max_num+1)for j := 0; j < len(li); j++ {arr[li[j]]++}k := 0for m, n := range arr {for p := 0; p < n; p++ {li[k] = mk++}}
}

9.桶排序

func bin_sort(li []int, bin_num int) {min_num, max_num := li[0], li[0]for i := 0; i < len(li); i++ {if min_num > li[i] {min_num = li[i]}if max_num < li[i] {max_num = li[i]}}bin := make([][]int, bin_num)for j := 0; j < len(li); j++ {n := (li[j] - min_num) / ((max_num - min_num + 1) / bin_num)bin[n] = append(bin[n], li[j])k := len(bin[n]) - 2for k >= 0 && li[j] < bin[n][k] {bin[n][k+1] = bin[n][k]k--}bin[n][k+1] = li[j]}o := 0for p, q := range bin {for t := 0; t < len(q); t++ {li[o] = bin[p][t]o++}}
}

10.基数排序

func radix_sort(li []int) {max_num := li[0]for i := 0; i < len(li); i++ {if max_num < li[i] {max_num = li[i]}}for j := 0; j < len(strconv.Itoa(max_num)); j++ {bin := make([][]int, 10)for k := 0; k < len(li); k++ {n := li[k] / int(math.Pow(10, float64(j))) % 10bin[n] = append(bin[n], li[k])}m := 0for p := 0; p < len(bin); p++ {for q := 0; q < len(bin[p]); q++ {li[m] = bin[p][q]m++}}}
}

11.用堆排解决top_k问题,思路:

  a.先取前k个数建小根堆,这样就能保证堆顶元素是整个堆的最小值;

  b.然后遍历列表的k到最后,如果值比堆顶大,就和堆顶交换,交换完后再对堆建小根堆,这样就能保证交换完后,堆顶元素仍然是整个堆的最小值;

  c.一直遍历到列表的最后一个值,这一步做完之后,就保证了整个列表最大的前k个数已经放进了堆里;

  d.按数的大到小出堆;

func sift(li []int, low, high int) {i := lowj := 2*i + 1tmp := li[i]for j <= high {if j < high && li[j] > li[j+1] {j++}if tmp > li[j] {li[i] = li[j]i = jj = 2*i + 1} else {break}}li[i] = tmp
}func top_k(li []int, k int) []int {for i := k/2 - 1; i >= 0; i-- {sift(li, i, k-1)}for j := k; j < len(li); j++ {if li[0] < li[j] {li[0], li[j] = li[j], li[0]sift(li, 0, k-1)}}for n := k - 1; n > 0; n-- {li[0], li[n] = li[n], li[0]sift(li, 0, n-1)}return li[:k]
}

转载于:https://www.cnblogs.com/Coufusion/p/9804655.html

Go之十大经典排序算法相关推荐

  1. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  2. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  3. 11月14日云栖精选夜读 | 动画+原理+代码,解读十大经典排序算法

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过 ...

  4. Algorithm:【Algorithm算法进阶之路】之十大经典排序算法

    Algorithm:[Algorithm算法进阶之路]之十大经典排序算法 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...

  5. python经典排序_python实现十大经典排序算法

    写在前面 本文参考十大经典排序算法(动图演示),这篇文章有动图显示,介绍的很详细.本文是部分内容有借鉴此博客,用python实现,有一些改进. 各种算法的时间.空间复杂度 1.冒泡排序 1.比较相邻的 ...

  6. 十大经典排序算法总结(够兄弟们喝一壶的)

    Ⅰ.十大经典排序算法之插入排序及其二分优化:https://blog.csdn.net/Kevinnsm/article/details/114403557 Ⅱ.十大经典排序算法之冒泡排序及其优化:h ...

  7. 教小学妹学算法:十大经典排序算法深度解析

    最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了. 今天呢,就在这分享一下我给小学妹讲十大经典排序算法的过程. 好吧,那我们 ...

  8. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  9. 【GIF动画+完整可运行源代码】C++实现 基数排序——十大经典排序算法之十

    十大经典排序算法系列博客-->传送门 基数排序是按照低位先排序,然后收集:再按照高位排序,然后再收集:依次类推,直到最高位.有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序.最 ...

  10. C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】

    十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...

最新文章

  1. 如何使用TensorFlow Eager执行训练自己的FaceID ConvNet
  2. lighttpd php7 源码安装,如何在CentOS 7上安装Lighttpd与PHP-FPM和MariaDB
  3. 机器人动力学方程的性质
  4. python nlp包_StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析
  5. 读债务危机0812:接管房利美和房地美
  6. VTK:相互作用之Picking
  7. .sql文件如何执行_干货|一条SQL查询语句是如何执行的
  8. C语言新手最常见的问题!你在这里跌倒过吗?
  9. gradle compile mysql_Gradle配置implementation、api与compile的区别
  10. 密度图的密度估计_不同类型的二维密度图小教程
  11. docker 容器和镜像的区别
  12. [渝粤教育] 中国地质大学 测量学 复习题
  13. SVN的学习和使用(七)——SVN提交操作
  14. 《JAVA程序设计基础与应用》pdf 附下载链接
  15. 贝叶斯因果网络_因果关系和贝叶斯网络
  16. 葡萄柚能放冰箱保存吗 葡萄柚怎么保存时间长
  17. b2b2c电商平台系统
  18. Cell(华表)组件的方法
  19. html5微信自动播放视频,科技常识:HTML5页面音视频在微信和app下自动播放的实现方法...
  20. html5 摇骰子游戏,html5摇骰子游戏

热门文章

  1. Java设计模式——装饰者模式
  2. 虚拟存储器管理(C++实现)
  3. iris流程图_如何搭建一个简单的机器学习流水线?
  4. android onresume时view,android – 当对话框出现时不调用OnResume
  5. java编程题有难度的_算法与编程面试题 不喜勿喷 难度指数:*****...
  6. ceph 面试_终于有人把Ceph分布式存储讲清楚了!
  7. 2021年如何0基础拿下HCIE证书?
  8. 如何选择最优路径完成云原生上云?听这场阿里云特别分享【云原生技术与最佳实践】
  9. 关于容器迁移、运维、查错与监控,你想知道的都在这里了
  10. charset参数 sqluldr2_SQLULDR2的安全保密功能