脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言数据结构之选择排序示例详解

Go语言数据结构之选择排序示例详解

2022-08-26 18:38宇宙之一粟 Golang

这篇文章主要为大家介绍了Go语言数据结构之选择排序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

选择排序

选择排序(selection sort)是一种原地(in-place)排序算法,适用于数据量较少的情况。由于选择操作是基于键值的且交换操作只在需要时才执行,所以选择排序长用于数值较大和键值较小的文件。

思想:

对一个数组进行排序,从未排序的部分反复找到最小的元素,并将其放在开头。

给定长度为 nnn 的序列和位置索引i=0 的数组,选择排序将:

  • 遍历一遍序列,寻找序列中的最小值。在 [i...n−1] 范围内找出最小值 minValue 的位置 minIndex
  • 用当前位置的值交换最小值。第 i 项的值与交换 minIndex 的值交换,swap(nums[i],nums[minIndex])
  • 对所有元素重复上述过程,直到整个序列排序完成。将下限 iii 增加1,并重复步骤 1 直到 i=n−2。

伪代码:

?
1
2
3
4
5
6
func selectionSort(nums []int, length int) {
  for i := 0; i < length-1; i++ { // O(N)
    minValue = nums[minIdx] // O(N)
    swap(nums[i], nums[minIndex]); // O(1), X may be equal to L (no actual swap)
  }
}

动画演示

Go语言数据结构之选择排序示例详解

Go 代码实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
import "fmt"
func main() {
  unsorted := []int{40, 13, 20, 8, 12, 10, 27}
  length := len(unsorted)
  selectionSort(unsorted, length)
  for i := 0; i < length; i++ {
    fmt.Printf("%d\t", unsorted[i])
  }
}
func selectionSort(nums []int, length int) {
  var minIdx int // 被选择的最小的值的位置
  for i := 0; i < length-1; i++ {
    minIdx = i
    // 每次循环的第一个元素为最小值保存
    var minValue = nums[minIdx]
    for j := i; j < length-1; j++ {
      if minValue > nums[j+1] {
        minValue = nums[j+1]
        minIdx = j + 1
      }
    }
    // 如果最小值的位置改变,将当前的最小值位置保存
    if i != minIdx {
      var temp = nums[i]
      nums[i] = nums[minIdx]
      nums[minIdx] = temp
    }
  }
}

运行结果为:

[Running] go run "e:\Coding Workspaces\LearningGoTheEasiestWay\Go 数据结构\选择排序\main.go"\
8 10 12 13 20 27 40

总结

Go语言数据结构之选择排序示例详解

选择排序的优点:

  • 易于实现,容易理解
  • 原地排序(不需要额外的存储空间),即 空间复杂度为 O(1)O(1)O(1)

缺点:

  • 扩展性较差
  • 时间复杂度为 O(n2)O(n^2)O(n2)

稳定性:

  • 选择排序是不稳定的排序算法。

以上就是Go语言数据结构之选择排序示例详解的详细内容,更多关于Go 数据结构选择排序的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7042671726114635812

延伸 · 阅读

精彩推荐
  • Golanggolang gorm 计算字段和获取sum()值的实现

    golang gorm 计算字段和获取sum()值的实现

    这篇文章主要介绍了golang gorm 计算字段和获取sum()值的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    疯狂的鸭血18742021-03-09
  • Golang出泛型后 API 怎么办?Go 开发者要注意了

    出泛型后 API 怎么办?Go 开发者要注意了

    在今天这篇文章中,我们针对 Rob Pike 为什么会要调整 Go 泛型后的标准库 API 等的提议进行了分析。为此我们了解到 Go 核心团队对 ”how to update APIs for gene...

    脑子进煎鱼了6442021-10-26
  • GolangGolang JSON的进阶用法实例讲解

    Golang JSON的进阶用法实例讲解

    这篇文章主要给大家介绍了关于Golang JSON进阶用法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需...

    yulibaozi6822020-05-19
  • GolangGo语言通道之无缓冲通道

    Go语言通道之无缓冲通道

    这篇文章介绍了Go语言通道之无缓冲通道,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    奋斗的大橙子3602022-07-16
  • Golanggolang 在windows中设置环境变量的操作

    golang 在windows中设置环境变量的操作

    这篇文章主要介绍了golang 在windows中设置环境变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    soulbboy11672021-06-08
  • Golang一个 Demo 学会使用 Go Delve 调试

    一个 Demo 学会使用 Go Delve 调试

    在 Go 语言中,Delve 调试工具是与 Go 语言亲和度最高的,因为 Delve 是 Go 语言实现的。其在我们日常工作中,非常常用。...

    脑子进煎鱼了7252021-07-26
  • Golanggolang实现redis的延时消息队列功能示例

    golang实现redis的延时消息队列功能示例

    这篇文章主要介绍了golang实现redis的延时消息队列功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    菜菜jjj7532020-05-31
  • Golanggolang中命令行库cobra的使用方法示例

    golang中命令行库cobra的使用方法示例

    这篇文章主要给大家介绍了关于golang中命令行库cobra的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    wangbin5062020-05-18