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

作者:宇宙之一粟 时间:2024-04-26 17:25:33 

选择排序

选择排序(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语言数据结构之选择排序示例详解

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

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

来源:https://juejin.cn/post/7042671726114635812

标签:Go,数据结构,选择排序
0
投稿

猜你喜欢

  • SQL的substring_index()用法实例(MySQL字符串截取)

    2024-01-27 19:30:19
  • pyqt5打包成exe可执行文件的方法

    2022-02-09 11:25:57
  • 使用Keras预训练好的模型进行目标类别预测详解

    2023-02-04 09:14:37
  • 异地远程访问本地SQL Server数据库

    2024-01-18 20:00:18
  • sql server 视图作用

    2009-01-05 13:53:00
  • python+opencv打开摄像头,保存视频、拍照功能的实现方法

    2021-06-12 15:16:02
  • Python爬取腾讯视频评论的思路详解

    2021-05-30 23:04:43
  • Python中np.random.randint()参数详解及用法实例

    2022-04-17 19:40:48
  • 详解Vue用自定义指令完成一个下拉菜单(select组件)

    2024-05-09 15:19:06
  • PyTorch中clone()、detach()及相关扩展详解

    2022-06-29 17:50:34
  • MySQL数据库只监听某个特定地址的方法

    2008-12-05 16:11:00
  • pytest实现测试用例参数化

    2023-12-10 19:01:21
  • Python列表对象实现原理详解

    2022-09-07 10:24:58
  • vue实现全屏滚动效果(非fullpage.js)

    2024-05-28 15:46:00
  • 总结python爬虫抓站的实用技巧

    2022-07-07 05:04:09
  • django项目环境搭建及在虚拟机本地创建django项目的教程

    2022-10-14 14:04:32
  • Mysql InnoDB删除数据后释放磁盘空间的方法

    2024-01-21 00:36:49
  • python单例模式之selenium driver实现单例

    2021-09-30 14:31:03
  • Spark GraphX 分布式图处理框架图算法详解

    2022-11-01 14:01:40
  • Python实现对中文文本分段分句

    2022-09-16 18:16:50
  • asp之家 网络编程 m.aspxhome.com