Go 实现选择排序算法及优化

news2025/1/12 1:58:07

Go 实现选择排序算法及优化

  • 选择排序
  • 图片演示
  • 普通算法
  • 优化算法
  • 小结

耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,今天分享的内容是使用 Go 实现选择排序算法。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

选择排序

选择排序是一种简单的比较排序算法,它的算法思路是首先从数组中寻找最小(大)的元素,然后放到数组中的第一位,接下来继续从未排序的数组中寻找最小(大)元素,然后放到已排序数组的末尾,依次类推,直到所有元素被排序。

图片演示

在这里插入图片描述

普通算法

import "fmt"

func main() {
	nums := [8]int{8, 2, 3, 1, 6, 5, 7, 4}
	fmt.Println("原数组:", nums)
	fmt.Println("--------------------------------")
	SelectionSort(nums)
}

func SelectionSort(nums [8]int) {
	for i := 0; i < len(nums)-1; i++ {
		minPos := i
		for j := i + 1; j < len(nums); j++ {
			if nums[minPos] > nums[j] {
				minPos = j
			}
		}
		nums[i], nums[minPos] = nums[minPos], nums[i]
		fmt.Printf("第 %d 轮后:%v\n", i+1, nums)
	}
	fmt.Println("--------------------------------")
	fmt.Println("排序后的数组:", nums)
}

执行结果:

原数组: [8 2 3 1 6 5 7 4]
--------------------------------
第 1 轮后:[1 2 3 8 6 5 7 4]
第 2 轮后:[1 2 3 8 6 5 7 4]
第 3 轮后:[1 2 3 8 6 5 7 4]
第 4 轮后:[1 2 3 4 6 5 7 8]
第 5 轮后:[1 2 3 4 5 6 7 8]
第 6 轮后:[1 2 3 4 5 6 7 8]
第 7 轮后:[1 2 3 4 5 6 7 8]
--------------------------------
排序后的数组: [1 2 3 4 5 6 7 8]

  • 升序排序。
  • 使用 i 变量表示最小元素的待放位置。
  • minPos 变量记录最小元素的的下标值,默认为 i
  • 通过变量 j 去寻找最小元素,ji + 1 的位置开始寻找。
  • 找到比 nums[minPos] 还小的元素,则将 j 的下标值赋给 minPos
  • 一轮下来,将最小元素的位置 minPosi 的位置互换,然后继续下一轮寻找,直到所有元素都被排序。
  • 该算法的时间复杂度为 O(N²)。

优化算法

普通算法是寻找最小值或最大值,然后放到指定位置。优化算法的改进点是同时寻找最小值和最大值。

import (
	"fmt"
)

func main() {
	nums := [4]int{3, 1, 4, 2}
	fmt.Println("原数组:", nums)
	fmt.Println("--------------------------------")
	SelectionSort(nums)
}

func SelectionSort(nums [4]int) {
	for left, right := 0, len(nums)-1; left <= right; {
		minPos := left
		maxPos := left
		for i := left + 1; i <= right; i++ {
			if nums[minPos] > nums[i] {
				minPos = i
			}
			if nums[maxPos] < nums[i] {
				maxPos = i
			}
		}
		nums[left], nums[minPos] = nums[minPos], nums[left]
		// 如果最大值刚好是在 left,待放最小值的位置,那么最大值就会被换走,所以需要判断一下
		if maxPos == left {
			maxPos = minPos
		}
		nums[right], nums[maxPos] = nums[maxPos], nums[right]
		fmt.Printf("第 %d 轮后:%v\n", left+1, nums)
		left++
		right--
	}
	fmt.Println("--------------------------------")
	fmt.Println("排序后的数组:", nums)
}

执行结果:

原数组: [8 2 3 1 6 5 7 4]
--------------------------------
第 1 轮后:[1 2 3 4 6 5 7 8]
第 2 轮后:[1 2 3 4 6 5 7 8]
第 3 轮后:[1 2 3 4 5 6 7 8]
第 4 轮后:[1 2 3 4 5 6 7 8]
--------------------------------
排序后的数组: [1 2 3 4 5 6 7 8]
  • left 变量表示待放最小值的位置,right 变量表示待放最大值的位置。minPos 记录最小值的下标值,maxPos 记录最大值的下标值,通过变量 i 去寻找最小值和最大值,寻找完毕后将它们进行交换。
  • 有一个注意的地方是,如果最大值刚好是在 left ,待放最小值的位置,那么最大值就会被换到 minPos 的位置,所以需要判断一下,纠正下标值。
  • 从执行结果来看,优化后的算法效率快了一倍,但是时间复杂度仍为 O(N²)。

小结

本文简单介绍了什么是选择排序,然后通过图片的方式演示选择排序的过程,接下来是实现 O(N²) 时间复杂度的算法,最后优化算法,从结果来看,优化后的算法效率快了一倍,但是时间复杂度仍为 O(N²)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一只脚踏入数据结构的大门,如何用C语言实现一个单链表(超超超详解,我的灵魂受到了升华)

目录 0.前言 1.什么是链表 1.1链表简介 1.2链表的分类 1.3为什么要有链表&#xff08;vs顺序表&#xff09; 1.3.1顺序表的缺点 1.3.2 链表的优点 1.3.3 顺序表的优点是链表的缺点 1.4.为什么选择实现结构最简单的单链表 2* 什么是单链表&#xff08;两种理解逻辑&…

window10+TensorRT-8.2.5.1+yolov5 v6.2 c++部署

一、准备工具 1.1、visual studio下载安装 参考&#xff1a;vs2019社区版下载教程&#xff08;详细&#xff09;_Redamancy_06的博客-CSDN博客_vs2019社区版 1.2、显卡驱动cudacudnn安装 参考&#xff1a;win10系统3060显卡驱动cuda11.5cudnn8.3安装_Bubble_water的博客-CS…

手写Spring3(Bean构造函数的类实例化策略)

文章目录目标项目结构一、代码实现1、新增getBean接口2、定义实例化策略接口3、JDK 实例化4、Cglib 实例化5、创建策略调用二、测试1、准备2、测试用例3、测试结果目标 上一篇文章&#xff0c;我们实例化对象&#xff0c;是通过无参的构造方式生成 所以今天是解决包含参数的构…

docker镜像的导入导出,并发布到服务器上

比如我本地的vue项目&#xff0c;先打包编译为一个镜像&#xff1a; docker build -t cvport . 不会编译的可以看我这篇文章&#xff1a;使用docker构建vue项目并成功运行在本地和线上_1024小神的博客-CSDN博客 开始将镜像保存为一个tar文件&#xff1a; docker save -o cvp…

基于java+springmvc+mybatis+jsp+mysql的高校学术交流平台

项目介绍 高校学术交流平台是基于java编程语言&#xff0c;mysql数据库&#xff0c;ssm框架&#xff0c;idea开发工具开发&#xff0c;本系统有管理员和用户两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看校园资讯&#xff0c;学术交流帖子&#xff0c;发布帖…

Akka 学习(五)消息传递的方式

目录一 消息传递方式1.1 消息不可变1.2 ASK消息模式1.3 Tell消息模式1.4 Forward消息模式1.4 Pipe消息模式有4种核心的Actor消息模式&#xff1a;Tell、Ask、Forward和Pipe。一 消息传递方式 在这里&#xff0c;将从Actor之间发送消息的角度来介绍所有关于消息传递的概念。 ● …

【多线程(六)】并发工具类的基本使用、ConcurrentHashMap1.7版本及1.8版本底层原理分析

文章目录6.并发工具类6.1 并发工具类-Hashtable6.2 并发工具类-ConcurrentHashMap基本使用6.3 并发工具类-ConcurrentHashMap1.7原理6.4 并发工具类-ConcurrentHashMap1.8原理6.5 并发工具类-CountDownLatch6.6并发工具类-Semaphore总结6.并发工具类 6.1 并发工具类-Hashtable…

一文看懂MySQL中order by排序语句的原理

order by 是怎么工作的&#xff1f; 表定义 CREATE TABLE t1 ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city)) ENGINEInnoDB;SQL语句可以…

零基础入门JavaWeb——Vue的生命周期

一、概念 在编程领域&#xff0c;生命周期是一个很常见的概念。一个对象从创建、初始化、工作、释放、清理和销毁&#xff0c;会经历很多环节的演变。 二、Vue对象的生命周期 三、生命周期钩子函数 Vue允许在特定的生命周期环节中通过钩子函数加入我们的代码。 3.1 示例代码…

基于双向LSTM模型进行电力需求预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

尚硅谷笔记——求和案例纯react版、redux精简版

家人们天气冷啦注意保暖呀&#xff0c;不要像我一样因为冷而不想起床学习&#xff0c;冬日里也不能放弃训练 看了两遍尚硅谷的redux课程&#xff0c;把reduc案例代码重新敲了一次为了加深印象还是写个播客把&#xff0c;强烈推荐大家看尚硅谷课太细致啦 redux 是什么&#x…

即将到来的2023,国内元宇宙开始“割”企业了?

元宇宙爆火一年后&#xff0c;UTONMOS即将成为全球化全部实现ERC-721协议NFT链上垂直游戏价值生态的系统平台&#xff0c;旨在通过利用自身所拥有的各类头部资源和游戏化打造内容层的融合&#xff0c;建立一个元气满满的元宇宙Web3.0平台。 通过数字藏品技术的应用&#xff0c…

Flask框架

Flask一 前言二 快速使用三 内置配置变量四 配置文件的写法五 路由六 cbv写法6.1 快速使用6.2 cbv加装饰器6.3 as_view的执行流程6.4 as_view的name参数6.5 继承View写cbv七 模板语法7.1 渲染变量7.2 变量的循环7.3 逻辑判断一 前言 Flask是一个基于Python开发并且依赖jinja2模…

Fluent中模型设置和数据的复用

1 背景 在实际工程中&#xff0c;必然存在利用仿真比较各类设计方案优劣的场景。 对于复杂模型&#xff0c;逐个设置各个设计方案的仿真模型并从头开始计算结果&#xff0c;既易错也耗时。因此需要通过模型设置和数据的复用&#xff0c;达到防错和提高工作效率。 2 模型设置复…

基于Docker做MySQL主从搭建与Django的读写分离

目录 基于Docker做MySQL主从搭建 django读写分离 基于Docker做MySQL主从搭建 主从的作用&#xff1a;写数据数据时使用主库&#xff0c;从库只用来读数据&#xff0c;这样做能够减少数据库压力&#xff0c;主从搭建可以一主一从&#xff0c;也可以是一主多从。 mysql主从配…

肝2022世界杯,怒写企业级镜像私仓Docker+Harbor实践

2022-12-09 揭幕2022卡塔尔世界杯4强角逐的第一天&#xff0c;越来越精彩了 同时记录程序猿的成长~ 1.背景 由于期望搭建一个企业级CICD的环境&#xff0c;开始尝试常规的gitlabjenkinsk8sdocker harborspringboot开始练手 其中版本如下&#xff1a; 1.gitlab: GitLab Com…

天权信安catf1ag网络安全联合公开赛---wp

文章目录misc简单隐写十位马WebhistoryCrypto疑惑ezrsapasswdre遗失的物品misc 简单隐写 丢进kali binwalk 分离一下 得到一个加密的压缩包 内含flag.txt 使用jphs无密码得到一个txt 得到password:catf1agcatf1agcatf1ag 解压压缩包得到一串字符串 dbug1bh{KQit_x1o_Z0v_…

threejs官方demo学习(2):相机

webgl_camera 不知道是哪里写的有问题&#xff0c;最终的效果&#xff0c;跟官方案例有比较大的差距。不过可以学到的知识点挺多的。 知识点 CameraHelper 相机辅助对象&#xff0c;用于模拟相机视锥体 // 创建透视相机 cameraPerspective new THREE.PerspectiveCamera(5…

二叉树路径和(c#)

问题描述 给定一个二叉树的根和一个整数值&#xff0c;如果二叉树中有根节点到叶子节点的路径上节点值的和等于给定的整数值&#xff0c;则返回真&#xff0c;否则返回假。 叶子节点:没有孩子的节点。 示例 示例1 Input: root [5,4,8,11,null,13,4,7,2,null,null,null,1], t…

两个List<Integer>在相同的值比较返回值为false的问题解析

写在前面:今天刷LeetCode的时候发现一个测试用例始终过不去&#xff0c;代码出问题处大概表述如下: List<Integer> a new ArrayList<>(); a.add(300); List<Integer> b new ArrayList<>(); b.add(300); if(a.get(0) b.get(0)){ 代码块B } else{ 代…