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

 更新时间:2022年08月26日 15:24:54   作者:宇宙之一粟  
这篇文章主要为大家介绍了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。

伪代码:

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 代码实现

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

总结

选择排序的优点:

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

缺点:

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

稳定性:

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

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

相关文章

  • 使用systemd部署和守护golang应用程序的操作方法

    使用systemd部署和守护golang应用程序的操作方法

    systemd是一个流行的守护进程管理器,可以轻松管理服务的启动、停止、重启等操作,让我们的应用程序始终保持在线,本文介绍了如何使用systemd部署和守护golang应用程序,感兴趣的朋友一起看看吧
    2023-10-10
  • Golang切片Slice功能操作详情

    Golang切片Slice功能操作详情

    这篇文章主要介绍了Golang切片功能操作详情,切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封,切片是一个引用类型,它的内部结构包含地址、长度和容量
    2022-09-09
  • 对Golang import 导入包语法详解

    对Golang import 导入包语法详解

    今天小编就为大家分享一篇对Golang import 导入包语法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • go语言VScode see 'go help modules' (exit status 1)问题的解决过程

    go语言VScode see 'go help modules' (exit statu

    最近上手学习go语言,准备在VSCode上写程序的时候却发现出了一点问题,下面这篇文章主要给大家介绍了关于go语言VScode see 'go help modules'(exit status 1)问题的解决过程,需要的朋友可以参考下
    2022-07-07
  • Golang实现简易的命令行功能

    Golang实现简易的命令行功能

    这篇文章主要为大家详细介绍了如何通过Golang实现一个简易的命令行功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-02-02
  • 如何使用Golang创建与读取Excel文件

    如何使用Golang创建与读取Excel文件

    我最近工作忙于作图,图表,需要自己准备数据源,所以经常和Excel打交道,下面这篇文章主要给大家介绍了关于如何使用Golang创建与读取Excel文件的相关资料,需要的朋友可以参考下
    2022-07-07
  • golang 字符串拼接方法对比分析

    golang 字符串拼接方法对比分析

    这篇文章主要为大家介绍了golang 字符串拼接方法对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Golang Compare And Swap算法详细介绍

    Golang Compare And Swap算法详细介绍

    CAS算法是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步Non-blocking Synchronization
    2022-10-10
  • k8s容器互联-flannel host-gw原理篇

    k8s容器互联-flannel host-gw原理篇

    这篇文章主要为大家介绍了k8s容器互联-flannel host-gw原理篇,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 浅析GO语言的垃圾回收机制

    浅析GO语言的垃圾回收机制

    今天我们来聊聊golang是如何进行垃圾回收的,我们知道,目前各语言进行垃圾回收的方法有很多,如引用计数、标记清除、分代回收、三色标记等,各种方式都有其特点,文中介绍的非常详细,感兴趣的小伙伴跟着小编一起学习吧
    2023-07-07

最新评论