虽然看过别人写了很多遍,而且自己也写过很多遍(指的是笔记),但是还是要写的就是排序算法。毕竟是初学Go语言,虽然之前写过,但是还是打算再写一遍。主要包括插入排序、选择排序、冒泡排序、快速排序、堆排序、归并排序。

先简单写下排序的思路。插入排序:每个值与前面的排序好的值比较大小,可能会交换多次;选择排序:当前值与后面的值比较大小,记录最小值的坐标,只交换一次;冒泡排序:两两比较,结果是最大的值到最后;快速排序:找分割值,小于的放小数组,大于的放大数组,再对大小数组进行快速排序;二分归并排序:这个不断二分,然后比较大小后归并返回。


插入排序

不断将当前坐标的值与前面的值比较,从最近的开始(因为是从小到大排序的)。时间复杂度是(1+...+n)=(1+n)n/2,也就是n的方,不过还不包括移动元素的时间,只是单纯的比较次数。

func insertSort(arr []int) []int {length := len(arr)//每个值和前面的比较for i := 1; i < length; i++{key := arr[i]j := i-1for key < arr[j] && j >= 0{   //不断让元素后移arr[j+1] = arr[j]j--}arr[j+1] = key  //将最终的位置交换}return arr
}

选择排序

选择当前坐标及后面的值中最小值的下标,并与当前坐标的值替换。并不稳定,因为当前坐标值会大幅度的跳跃,不过和插入排序都是O(1)的空间复杂度,意味着是原地排序。

func selectSort(arr []int) []int {length := len(arr)//当前值和后面比较出最小的for i :=0; i < length-1; i++{minID := ifor j := i+1; j < length; j++{if (arr[minID] > arr[j]){minID = j}arr[i], arr[minID] = arr[minID], arr[i]}}return arr
}

冒泡排序

注意一般来说使用for是因为确定范围,而这下面的第一层for循环是因为次数,每次for语句都能够确定一个元素的位置。两两比较,结果就是最大的放在了最后面。

func bubbleSort(arr []int) []int{//思路是两两比较for i := 0; i < len(arr)-1; i++{  //因为只需要确定len(arr)-1个元素的位置,最后一个元素的位置就确定了flag := 0for j := 0; j < len(arr)-i-1; j++{if arr[j] > arr[j+1]{arr[j], arr[j+1] = arr[j+1], arr[j]flag = 1} }if flag == 0{return arr}} return arr
}

快速排序

实际上就是通过比较和某一值的大小,大的放该值的右边,小的该值的放左边。利用了直接递归,不过如果比较值选的不好,时间复杂度会退化成O(n的方),也就是每次只排好一个值的位置。

func quickSort(arr []int) []int{if len(arr) <= 1{return arr}//选值比较key := arr[0]left := []int{}right := []int{}for i := 1; i < len(arr); i++{if key > arr[i]{left = append(left,arr[i])}else{right = append(right,arr[i])}}left = quickSort(left)right = quickSort(right)return append(append(left,key),right...)
}

堆排序

这个并不好写,堆本质上是一种特殊的完全二叉树,大根堆是每个节点的值 ≥ 其子节点的值,根节点最大。小根堆则是每个节点的值 ≤ 其子节点的值,根节点最小,通常可以通过数组来实现,并且父子关系通过下标来计算。


func heapSort(arr []int) {n := len(arr)// 1. 构建大顶堆(从最后一个非叶子节点开始)for i := n/2 - 1; i >= 0; i-- {heapify(arr, n, i)}// 2. 逐个提取堆顶元素(最大值)到数组末尾for i := n - 1; i > 0; i-- {arr[0], arr[i] = arr[i], arr[0] // 交换堆顶与末尾元素heapify(arr, i, 0)              // 对剩余元素重新堆化}
}// 堆化函数:维护以 root 为根的子树满足大顶堆性质
func heapify(arr []int, n, root int) {largest := root     // 初始化最大值为根节点left := 2*root + 1  // 左子节点right := 2*root + 2 // 右子节点// 找出根、左、右中的最大值if left < n && arr[left] > arr[largest] {largest = left}if right < n && arr[right] > arr[largest] {largest = right}// 若最大值不是根节点,则交换并递归调整if largest != root {arr[root], arr[largest] = arr[largest], arr[root]heapify(arr, n, largest)}
}

归并排序

递归深度可以算是logn,每次merge合并是n,时间复杂度估计是O(nlogn)。不过空间复杂度是O(n),这和递归没有关系,想象一棵递归树,所有叶节点的合并操作​​总空间需求为 O(n)​​(各层空间不叠加)。


func mergeSort(arr []int) []int{//先二分length := len(arr)if length <= 1 {return arr}mid := length/2left := mergeSort(arr[:mid])right := mergeSort(arr[mid:])return merge(left,right)
}
func merge(left []int, right []int) []int{//核心原理是不断将小值放到前面lenght := len(left) + len(right)slice := make([]int,0,lenght)i,j := 0,0for i < len(left) && j < len(right){if left[i] < right[j]{slice = append(slice,left[i])i++}else{slice = append(slice,right[j])j++}}slice = append(slice, left[i:]...)slice = append(slice, right[j:]...)return slice
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 6 篇:目标规则与负载均衡 - `DestinationRule` 详解

系列文章:《Istio 服务网格详解》 第 6 篇:目标规则与负载均衡 - DestinationRule 详解 本篇焦点: 深入理解 DestinationRule 的核心作用:定义流量在到达目的地之后的行为。 详细剖析其三大核心功能:服务子集 (Subsets), 流量策略 (Traffic Policy), TLS 设置。 动手实战…

一个简洁的 C++ 日志模块实现

一个简洁的 C 日志模块实现 1. 引言 日志功能在软件开发中扮演着至关重要的角色&#xff0c;它帮助开发者追踪程序执行过程、诊断问题以及监控系统运行状态。本文介绍一个使用 C 实现的轻量级日志模块&#xff0c;该模块支持多日志级别、线程安全&#xff0c;并提供了简洁易用…

C语言---数据类型

文章目录数据类型分类1. 基本类型 (Basic Types)a. 整数类型 (Integer Types)char (字符型)int (整型)short (短整型)long (长整型)long long (C99标准引入)图片汇总b. 浮点类型 (Floating-Point Types)float (单精度浮点型)double (双精度浮点型)long double (长双精度浮点型)…

本搭建乌云漏洞库

1.下载镜像站文件&#xff0c;并拖入虚拟机 2.将bugs.rar解压至网站根目录下 /var/www/html 3.配置bugs/conn.php 4.在bugs下创建upload目录&#xff0c;将10-14、15-a、15-b、16压缩包文件解压到该upload目录 5.把wooyun.rar解压到 /mysql/data/wooyun目录下 6.配置hosts文件后…

Vmware虚拟机 处理器配置选项配置介绍

1. 处理器配置选项好&#x1f44c;&#xff0c;我来帮你逐一解读 VMware 里 虚拟机处理器 这些选项的含义。 你截的图里&#xff0c;主要有三块内容&#xff1a; 处理器数量 每个处理器的内核数量 ©虚拟化引擎1️⃣ 处理器数量 这是分配给虚拟机的 逻辑 CPU 插槽数。一般…

day40-tomcat

1.每日复盘与今日内容1.1复盘keepalived高可用配置抢占式与非抢占式脑裂keepalived处理Nginx挂掉1.2今日内容部署、安装、配置tomcat(systemctl)Tomcat主配置文件部署静态页部署zrlog&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;接入负载均衡挂载到NFS2…

【RA-Eco-RA4E2-64PIN-V1.0 开发板】步进电机的串口控制

【RA-Eco-RA4E2-64PIN-V1.0 开发板】步进电机的串口控制 本文介绍了 RA-Eco-RA4E2-64PIN-V1.0 开发板通过串口指令实现 28BYJ-48 步进电机旋转角度和速度的精确控制的项目设计。 项目介绍 硬件连接&#xff1a;28BYJ-48 步进电机、ULN2003 驱动板、Jlink 调试器、供电电源等&am…

PiscCode基于 Mediapipe 的人体多模态关键点检测与可视化系统 —— HumanMultiLandmarker 深度解析

一、引言 在计算机视觉领域&#xff0c;人体关键点检测&#xff08;Human Pose Estimation&#xff0c;HPE&#xff09;一直是研究和应用的热点方向之一。随着深度学习与实时图像处理技术的发展&#xff0c;人体姿势估计已经从传统的 2D 检测走向了 3D 空间建模&#xff0c;并…

文献阅读笔记【物理信息机器学习】:Physics-informed machine learning

文献阅读笔记&#xff1a;Physics-informed machine learningSummaryResearch ObjectiveBackground / Problem Statement问题背景研究现状需解决的问题问题出现的原因分析问题解决思路Method(s)问题建模作者解决问题的方法/算法1. 观测偏差&#xff08;Observational Biases&am…

Linux服务环境搭建指南

实验拓扑概述**实验拓扑&#xff1a; APPSRV&#xff1a; 主机名&#xff1a;appsrv.example.com ip地址&#xff1a;192.168.100.10 网关&#xff1a;192.168.100.254 网卡为NAT模式 STORAGESRV&#xff1a; 主机名&#xff1a;storagesrv.example.com ip地址&#xff1a;192.…

[特殊字符] 数据库知识点总结(SQL Server 方向)

一、数据库基础概念数据库&#xff08;Database&#xff09;&#xff1a;存储和管理数据的容器。数据表&#xff08;Table&#xff09;&#xff1a;以行和列形式组织数据。行&#xff08;Row&#xff09;&#xff1a;一条记录。列&#xff08;Column&#xff09;&#xff1a;字…

【PSINS工具箱】MATLAB例程,二维平面上的组合导航,EKF融合速度、位置和IMU数据,4维观测量

文章目录关于工具箱程序简介代码概述核心功能与步骤运行结果MATLAB代码关于工具箱 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导&#xff1a;https://blog.csdn.net/callmeup/article/details/137087932 本文为二维平面上的定位&am…

MiMo-VL 技术报告

摘要 我们开源了 MiMo-VL-7B-SFT 和 MiMo-VL-7B-RL 两个强大的视觉语言模型,它们在通用视觉理解和多模态推理方面均展现出最先进的性能。MiMo-VL-7B-RL 在 40 项评估任务中的 35 项上优于 Qwen2.5-VL-7B,并在 OlympiadBench 上获得 59.4 分,超越了参数量高达 780 亿的模型。…

CTFshow Pwn入门 - pwn 19

先看main函数&#xff1a;fclose(_bss_start) fclose(stdout) 关闭了默认fd1的输出&#xff0c;所以system的结果无法直接看到。 思路&#xff1a; 输出重定向。 ls 1>&0 ls >&0 ls >&2 ###三种写法均可将输出重定向到能回显的终端并获得一个新的交互…

Redis(以Django为例,含具体操作步骤)

简介Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;支持多种数据结构&#xff08;如字符串、哈希、列表、集合、有序集合等&#xff09;&#xff0c;可用作数据库、缓存或消息队列。其核心特点包括&#xff1a;高性能&am…

浏览器解析网址的过程

问题浏览器解析网址的过程我的回答当你在浏览器地址栏输入一个URL&#xff08;比如www.example.com&#xff09;并按下回车后&#xff0c;会发生以下一系列步骤&#xff1a;首先&#xff0c;浏览器会解析URL结构&#xff0c;确定要访问的协议、域名和路径。如果你没有输入协议部…

NVIDIA Nsight Systems性能分析工具

* 性能分析 NVIDIA Nsight Systems (推荐)&#xff1a; 这是 NVIDIA 官方推荐的更现代、功能更强大的分析工具。 安装 Nsight Systems在 Docker 容器中启动程序&#xff1a;# 确保你在启动容器时挂载了/usr/local/cuda/targets/x86_64-linux/lib/ 和 /usr/local/nvidia/lib64 #…

后台管理系统-14-vue3之tag标签页的实现

文章目录 1 tag静态实现 1.1 CommonTag.vue(el-tag) 1.2 Main.vue(普通组件标签) 2 tag通过pinia管理 2.1 CommonAside.vue(菜单点击事件) 2.2 stores/index.js(selectMenu()和tags) 2.3 CommonTag.vue(计算属性tags) 3 点击tag之后跳转到指定页面 3.1 views/Mail.vue(商品) 3.…

CMake2: CMakeLists.txt的常用命令

参考链接: 爱编程的大丙 | CMake教程 CMakeLists指令以及常用方法 现代 CMake 教程 文章目录1. cmake_minimum_required( )2. project( )3. add_executable( )4. set()5. aux_source_directory( )6. file( )7. include_directories( )8. add_library( )9. link_libraries()与li…

Ansible入门:自动化运维基础

Ansible 基础概念与安装1. 自动化动机 (Motivation for Automation)概念解释&#xff1a; 指为什么要用Ansible等工具来替代手动管理服务器。核心动机包括&#xff1a;效率与速度&#xff1a; 同时在上百甚至上千台服务器上执行任务&#xff0c;秒级完成&#xff0c;远非人工可…