Golang实现常见排序算法的示例代码

 更新时间:2022年05月17日 15:24:47   作者:饭米粒  
现在的面试真的是越来越卷了,算法已经成为了面试过程中必不可少的一个环节,你如果想进稍微好一点的公司,算法是必不可少的一个环节。本文为大家准备了Golang实现常见排序算法的示例代码,需要的可以参考一下

前言

现在的面试真的是越来越卷了,算法已经成为了面试过程中必不可少的一个环节,你如果想进稍微好一点的公司,「算法是必不可少的一个环节」。那么如何学习算法呢?很多同学的第一反应肯定是去letcode上刷题,首先我并不反对刷题的方式,但是对于一个没有专门学习过算法的同学来说,刷题大部分是没什么思路的,花一个多小时暴力破解一道题意义也不大,事后看看别人比较好的解法大概率也记不住,所以我觉得「专门针对算法进行一些简单的训练」是很有必要的,正好我自己最近也在学习,同时把学习成果同步更新在公众号上,可能会更很多期,希望能帮助到你。另外最近很多同学也都在学习go,所以我就用go代码演示算法。今天咱们闲话不用多说,就从最简单的开始。

五种基础排序算法对比

五种基础排序算法对比

1、冒泡排序

算法描述

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 重复步骤1~3,直到排序完成。

代码演示

func bubbleSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for e := len(arr) - 1; e > 0; e-- {
  for i := 0; i < e; i++ {
   if arr[i] > arr[i+1] {
    Swap(arr, i, i+1)  //交换元素
   }
  }
 }
 return arr
}
func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

2、选择排序

算法描述

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

  • 将假想墙放置在数字列表最左侧,墙的左侧为已排序子列表,右侧为未排序子列表。
  • 找出(选择)未排序子列表中的最小(或最大)元素。
  • 把选择的元素与未排序列表中第一个元素进行交换。
  • 将假想墙向右移动一个位置。
  • 反复执行 2 至 4 步操作,直至整个数字列表排序完成(需要 n - 1 轮)。

代码演示

func selectSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for i := 0; i < len(arr); i++ {
  var minIndex int = i
  for j := i + 1; j < len(arr); j++ {
   if arr[j] < arr[minIndex] {
    minIndex = j
   }
  }
  arr = Swap(arr, i, minIndex)
 }
 return arr

}
func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

3、插入排序

算法描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序。
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描。
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置。
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;将新元素插入到该位置后;
  • 重复步骤2~5。

代码实现

func insertSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for i := 1; i < len(arr); i++ {
  for j := i - 1; j >= 0; j-- {
   if arr[j] > arr[j+1] {
    Swap(arr, j, j+1)
   }
  }
 }
 return arr
}
func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

4、快速排序

算法描述

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

  • 从数列中挑出一个元素,称为 “基准”(pivot)。
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

代码实现

//快速排序
func quickSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 middle := arr[0]
 var left []int
 var right []int
 for i := 1; i < len(arr); i++ {
  if arr[i] > middle {
   right = append(right, arr[i])
  } else {
   left = append(left, arr[i])
  }
 }
 middle_s := []int{middle}
 left = quickSort(left)
 right = quickSort(right)
 arr = append(append(left, middle_s...), right...)
 return arr
}

以上就是Golang实现常见排序算法的示例代码的详细内容,更多关于Golang排序算法的资料请关注脚本之家其它相关文章!

相关文章

  • 通过与Java功能上的对比来学习Go语言

    通过与Java功能上的对比来学习Go语言

    这篇文章主要介绍了通过与Java功能上的对比来学习Go语言的相关资料,需要的朋友可以参考下
    2023-02-02
  • Golang中unicode码和中文的互相转换函数使用

    Golang中unicode码和中文的互相转换函数使用

    这篇文章主要为大家介绍了Golang中unicode码和中文的互相转换函数使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 详解Go并发编程时如何避免发生竞态条件和数据竞争

    详解Go并发编程时如何避免发生竞态条件和数据竞争

    大家都知道,Go是一种支持并发编程的编程语言,但并发编程也是比较复杂和容易出错的。比如本篇分享的问题:竞态条件和数据竞争的问题
    2023-04-04
  • Golang项目在github创建release后自动生成二进制文件的方法

    Golang项目在github创建release后自动生成二进制文件的方法

    这篇文章主要介绍了Golang项目在github创建release后如何自动生成二进制文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • go-zero源码阅读之布隆过滤器实现代码

    go-zero源码阅读之布隆过滤器实现代码

    布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难,这篇文章主要介绍了go-zero源码阅读-布隆过滤器,需要的朋友可以参考下
    2023-02-02
  • Go语言建议多使用切片少使用数组原理探究

    Go语言建议多使用切片少使用数组原理探究

    这篇文章主要为大家介绍了Go语言建议多使用切片少使用数组原理探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go1.18新特性对泛型支持详解

    Go1.18新特性对泛型支持详解

    这篇文章主要为大家介绍了Go1.18新特性对泛型支持详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go Asynq异步任务处理的实现

    Go Asynq异步任务处理的实现

    Asynq是一个新兴的异步任务处理解决方案,它提供了轻量级的、易于使用的API,本文主要介绍了Go Asynq异步任务处理的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-06-06
  • GO语言实现标题闪烁效果

    GO语言实现标题闪烁效果

    这篇文章主要介绍了GO语言实现标题闪烁效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 看看你的Go应用是否用了正确CPU核数

    看看你的Go应用是否用了正确CPU核数

    这篇文章主要为大家介绍了Go应用正确的CPU核数分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论