集中常见的排序方法Go语言版本实现

简单排序:插入排序、选择排序、
冒泡排序 分治排序:快速排序、归并排序
分配排序:桶排序、基数排序
树状排序:堆排序
其他:计数排序、希尔排序

稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
非原地排序:需要利用额外的数组来辅助排序。
时间复杂度:一个算法执行所消耗的时间。
空间复杂度:运行完一个算法所需的内存大小。

/**  insertSort   * 插入排序法     * @param arr     * @return     */
func insertSort(arr []int) {//	//判断数组是否为空或者长度是否大于2if len(arr) < 2 {return}//循环遍历数组for i := 1; i < len(arr); i++ {//定义变量保存要插入的值tem := arr[i]k := i - 1for k >= 0 && arr[k] > tem {arr[k+1] = arr[k]k--}//元素插入arr[k+1] = tem}return
}// selectSort 选择排序 时间复杂度可能很高
func selectSort(arr []int) {n := len(arr)for i := 0; i < n-1; i++ {m := ifor j := i + 1; j < n; j++ {if arr[m] > arr[j] {m = j}}//交换temp := arr[i]arr[i] = arr[m]arr[m] = temp}
}// bubbleSort 冒泡排序算法
func bubbleSort(arr []int) {if len(arr) < 2 {return}flag := true//加一个标志位,记录上一次是否发生了交换,如果是,我们则进行下一轮,如果没有,说明已经冒泡好了for i := 1; i < len(arr) && flag; i++ {//控制次数,第几趟排序,只需要n-1趟,有交换时进行,只有flag=false就说明上一次一个元素都没有进行交换flag = false//假定未交换for j := 0; j < len(arr)-i; j++ {if arr[j] > arr[j+1] {temp := arr[j]arr[j] = arr[j+1]arr[j+1] = tempflag = true}}}
}// quickSort 快速排序算法
func quickSort(arr []int, left, right int) []int {if left < right {//获取基点元素所处的位置mid := partition(arr, left, right)//进行分割arr = quickSort(arr, left, mid-1)arr = quickSort(arr, mid+1, right)}return arr
}
func partition(arr []int, left, right int) int {//选取基点元素pivot := arr[left]i := left + 1j := rightfor {// 向右找到第一个小于等于 pivot 的元素位置for i <= j && arr[i] <= pivot {i++}// 向左找到第一个大于等于 pivot 的元素位置for i <= j && arr[j] >= pivot {j--}if i >= j {break}//交换两个元素的位置,使得左边的元素不大于pivot,右边的不小于pivottemp := arr[i]arr[i] = arr[j]arr[j] = temp}arr[left] = arr[j]// 使中轴元素处于有序的位置arr[j] = pivotreturn j
}// 堆排序
func heapSort(arr []int) {//1.构建大顶堆for i := len(arr)/2 - 1; i >= 0; i-- {//从第一个非叶子结点从下至上,从右至左调整结构sift(arr, i, len(arr))}//2.调整堆结构+交换堆顶元素与末尾元素for i := len(arr) - 1; i > 0; i-- {//现在的数组第一个就是根结点,最小值所在,进行交换,把它放到最右边temp := arr[i]arr[i] = arr[0]arr[0] = temp//重新建立堆sift(arr, 0, i)//重新对堆进行调整}
}/**建立堆的方法私有方法,只允许被堆排序调用@param arr     要排序数组@param parent  当前的双亲节点@param len     数组长度*/
func sift(arr []int, parent, len int) {value := arr[parent]//先取出当前元素ifor child := 2*parent + 1; child < len; child = child*2 + 1 {//从parent结点的左子结点开始,也就是2*parent+1处开始if child+1 < len && (arr[child] < arr[child+1]) {//如果左子结点小于右子结点,child指向右子结点child++//右孩子如果比左孩子大,我们就将现在的孩子换到右孩子}//判断是否符合大顶堆的特性, 如果右孩子大于双亲,自然左孩子也大于双亲,符合//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)if value < arr[child] {arr[parent] = arr[child]parent = child} else {//如果不是,说明已经符合我们的要求了。break}}arr[parent] = value//将value值放到最终的位置
}

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

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

相关文章

Mesh自组网通信技术概述

Mesh自组网核心技术 Mesh自组网&#xff08;Mesh Networking&#xff09;是一种网络技术&#xff0c;主要用于在多个节点之间建立动态的、自我管理的网络连接。这种技术的核心在于其自我组织和自我修复的能力&#xff0c;使得网络能够在节点移动或节点故障时自动调整。以下是Me…

2024.1.17 用户画像day02 - Elastic Search

目录 ES和数据库的类比 ELK集中日志协议栈介绍 ES的介绍 ES的架构 ES中的名词 ES中的角色 分片与副本的区别在于: MYSQL分库与分表: 倒排序索引: ES写入数据原理: ES读取、检索数据原理: 重点: ES 的架构 , ES读写的原理 ES和数据库的类比 关系型数据库非关系型数…

mysql进阶-索引进阶

目录 1. 索引的相关语法 1.1 创建索引&#xff1a; 1.2 删除索引&#xff1a; 1.3 其他修改或创建方法&#xff1a; 2. 索引创建分类 2.1 索引类型 2.2 索引方法 2.3 索引分类 3. 索引原则 3.1 覆盖索引 3.2 最左前缀原则 3.3 索引下推(index condition pushdown) …

C++发展史

目录 什么是C C的发展史 C的重要性 C在实际工作中的应用 “21天教你学会C” 什么是C 先看看祖师爷&#xff0c;记得多拜拜&#x1f92d; C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度…

逻辑卷管理、逻辑卷扩展、文件系统刷新、逻辑卷删除、VDO、RAID磁盘阵列、查看进程命令、进程控制、进程管理

1 打开虚拟机 2 环境准备&#xff1a;添加一块新的80G硬盘 [rootlocalhost ~]# lsblk 80G硬盘进行&#xff08;MBR分区模式&#xff09;规划分区 划分3个10G的主分区;2个20G的逻辑分区 [rootlocalhost ~]# fdisk /dev/vdb n 创建主分区--->回车--->回车--->回车…

Vue3 + Electron框架读取程序外部配置文件

网上找了一堆都不行&#xff0c;根据这个步骤来肯定能用 1. 在项目下新建一个config.json文件 2. json文件中写入一些配置 3. vue.config.js中配置打包时把config.json文件copy到应用目录下 pluginOptions:{electronBuilder:{nodeIntegration:true,builderOptions: {extraReso…

MySQL表的基本插入查询操作详解

博学而笃志&#xff0c;切问而近思 文章目录 插入插入更新 替换查询全列查询指定列查询查询字段为表达式查询结果指定别名查询结果去重 WHERE 条件基本比较逻辑运算符使用LIKE进行模糊匹配使用IN进行多个值匹配 排序筛选分页结果更新数据删除数据截断表聚合函数COUNTSUMAVGMAXM…

怎样实现安全便捷的网间数据安全交换?

数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换&#xff0c;则是需要进行跨网络、跨网段甚至跨组织地进行数据交互&#xff0c;对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…

2024美赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

redis数据安全(一)数据持久化

一、Redis数据安全措施: 1、将数据持久化至硬盘 2、将数据复制至其他机器&#xff1b; 复制是在数据持久化的基础上进行的。 二、将数据持久化至硬盘 1、介绍&#xff1a;Redis是一个基于内存的数据库&#xff0c;它的数据是存放在内存中&#xff0c;内存有个问题就是关闭…

Python中使用HTTP代理进行网络请求

在Python中&#xff0c;HTTP代理是一种常用的技术&#xff0c;用于控制和修改HTTP请求和响应。通过使用HTTP代理&#xff0c;我们可以更好地控制网络请求的行为&#xff0c;提高安全性、隐私性和效率。下面我们将详细介绍如何在Python中使用HTTP代理进行网络请求。 一、HTTP代…

风丘科技为您提供完整的ADAS测试方案

一 方案概述 随着5G通讯与互联网的快速发展&#xff0c;智能汽车和ADAS辅助系统的研究与发展在世界范围内也在如火如荼地进行。风丘科技紧跟时代脚步&#xff0c;经多年积累沉淀&#xff0c;携手整车厂与高校共同研发打造出了一套完整且适用于国内ADAS测试的系统方案。 | ADAS…

sql中的explain关键字用法

在SQL中&#xff0c;使用EXPLAIN关键字可以获取查询的执行计划&#xff0c;以便进行性能优化和查询调优。执行计划提供了关于查询操作的详细信息&#xff0c;涵盖了多个表头字段&#xff0c;每个字段都提供了特定的信息。以下是explain表头字段解释&#xff1a; id&#xff1…

工厂企业消防安全AI可视化视频智能监管解决方案

一、方案背景 2023年11月20日下午6时30分许&#xff0c;位于江苏省无锡市惠山区前洲街道的某公司突发严重火灾&#xff0c;共造成7人死亡。这次火灾提醒我们工业安全至关重要&#xff0c;企业都应该时刻保持警惕&#xff0c;加强安全意识和培训&#xff0c;提高应对突发事件的…

vue实现 marquee(走马灯)

样式 代码 <div class"marquee-prompt"><div class"list-prompt" refboxPrompt><span v-for"item in listPrompt" :title"item" class"prompt">{{item}}</span></div> </div>data() {…

探索 Python:发现有趣的库——第 3 章:玩转自然语言处理

代码侠和算法仙正在一间充满科技感的实验室里探讨自然语言处理&#xff08;NLP&#xff09;的奥秘。 代码侠&#xff1a; 嘿&#xff0c;算法仙&#xff0c;我最近在研究自然语言处理&#xff0c;但感觉有点复杂啊。 算法仙&#xff1a; 呵呵&#xff0c;别担心&#xff0c;我…

spring retry 配置及使用

spring retry 配置及使用 接口或功能因外界异常导致失败后进行重推机制 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.1.RELEASE</version></p…

tb网关中 如何转换数据,编写自定义转换规则,将自定义的复杂数据格式在网关层格式化,不借助规则链

通过网关上传的复杂格式数据 [{"host_time": 1700720548312,"device_id": "C20231123115931009","gateway_id": "ID20230508001","timestamp": 1700720548025,

【分布式监控】zabbix与grafana连接

1.在zabbix- server服务端安装grafana&#xff0c;并启动服务 先在官网下载软件 https://grafana.com/grafana/download/9.4.7?editionenterprise&pggraf&plcmtdeploy-box-1#可以翻译成中文介绍&#xff0c;很详细的教程 yum install -y https://dl.grafana.com/ent…

PDF转PowerPoint - Java实现方法

通过编程实现PDF转PPT的功能&#xff0c;可以自动化转换过程&#xff0c;减少手动操作的工作量&#xff0c;并根据需要进行批量转换。将PDF文件转换为PPT文档后&#xff0c;可以利用PPT的丰富功能和动画效果&#xff0c;达到更好的演示效果。 在Java中&#xff0c;我们可以使用…