go语言冒泡排序算法之泛型实现 支持整型,浮点型和字符串排序 golang bubble sort general

冒泡排序是一个比较经典的基础算法, 是学习编程的同学们所必备的算法之一,今天就介绍一个go语言里面使用泛型实现的冒泡排序算法, 支持字符串 string,数字 int  float 等的排序。

在go语言中通常我们在进行数据比较时都是使用的comparable接口 ,但是这个接口在今天的这个算法里面是不能用的,如下

原因: comparable是一个实现了所有可比较的数据类型的一个go的内置接口,包括(booleans, numbers, strings, pointers, channels, arrays比较类型, 结构体中可比较的字段等. 这个comparable仅用于参数类型约束,不能用于一个变量的值。

func MyComparable[E comparable](args []E) {// 这里的 args[n]之间是不能使用 > <等符号的,因为这个comparable的类型可能是不可使用< >符号的类型,比如 布尔 这个类型是不能使用 > 或者< 符号的.//args[0]> args[1]// 异常 invalid operation: args[0] > args[1] (type parameter E is not comparable with >)compilerUndefinedOp}

既然不能使用comparable,那我们就只能自己定义了。

冒泡算法 实现方式1: 自己利用泛型来约束数据类型是可比较的类型


// 使用泛型约束来实现的冒泡排序法
// 这里的泛型约束 [S ~[]E, E ~int | ~float32 | ~float64 | ~string] 表示S参数底层必须是一个切片,且切片的类型只能是这里指定的类型之一
// S ~[]E 约束S的类型必须是E类型的切片
// E int | int8 | int32 | int64 | float32 | float64 | ~string 这个约束表示 E的类型的底层类型必须是这里指定的数据类型之一
// 这里的 ~ 表示的是约束数据的底层类型
func BubbleSortGeneral[S ~[]E, E int | int8 | int32 | int64 | float32 | float64 | ~string](arr S) {len1 := len(arr) - 1 // 外层循环次数 数据长度 -1var tmp E            // 中间变量,用于交换, 注意这里的类型为 泛型 E// 外层循环, 这个每循环一次找出一个最大的数并确定其位置for i := 0; i < len1; i++ {// 这里的每次循环次数是逐渐减少的,因为外层每次循环就会确定一个数的位置for j := 0; j < len1-i; j++ {// 如果当前数 大于后一个数 则进行位置交换if arr[j] > arr[j+1] {tmp = arr[j]arr[j] = arr[j+1]arr[j+1] = tmp}}}
}

冒泡算法实现方式2  借助constraints.Ordered来约束类型

这个方法需要借助第三方包 golang.org/x/exp/constraints  里面的 constraints.Ordered 来约束E必须是一个可比较的类型

import ("fmt""golang.org/x/exp/constraints"
)// 泛型 这里需要使用 constraints.Ordered 来约束E必须是一个可比较的类型
// 因为constraints.Ordered这个接口定义了他的类型为 Integer | Float | ~string
// 所以他可以接受 > < 等运算符
// 注意这个 constraints.Ordered非go内置的接口,所以需要先安装才能导入
// go get -u golang.org/x/exp/constraints 这个命令会将这个包安装到用户设定的 $GOPATH 文件夹下的 pkg/mod/ 文件夹下
// 安装后就可以通过 import "golang.org/x/exp/constraints" 导入使用了
func BubbleSortGeneral2[E constraints.Ordered](arr []E) {fmt.Printf("泛型入参arr类型:%T\n", arr)len1 := len(arr) - 1 // 外层循环次数 长度 -1var tmp E            // 中间变量定义,用于交换数据for i := 0; i < len1; i++ {// 每次比较的数目逐渐减少, 且减少的数量为 长度 - 外层循环的次数i//  因为外层每循环一次就确定好了一个数的位置(放到最右边),// 这样确定了位置的数后面就不需要再次比较了,所以这里的j每次都会减少for j := 0; j < len1-i; j++ {if arr[j] > arr[j+1] {tmp = arr[j]arr[j] = arr[j+1]arr[j+1] = tmp}}}
}

使用示例:

//var arr = [5]int{90, 24, 69, 80, 57, 13} // 数组// var arr = []float64{1, 21, 2.1, 1.6, 0.8, 123.01, 999, 1, 2.0} // float64切片// var arr = []int64{1, 21, 1, 16, 888, 123, 127, 1, 2} // int64切片var arr = []int8{1, 21, 1, 16, 8, 123, 127, -128, 2, -123} // int8切片 注意 int8在内存中表示1个字节, 占8位, 能表示的数的范围是 -128至127// var arr = []string{"5", "1", "你好", "Yunnan", "3", "2", "中国", "4", "x", "Hello", "c", "a", "b"} // string切片fmt.Printf("arr排序前:%v \n", arr)BubbleSortGeneral(arr)fmt.Printf("arr排序后:%v \n", arr)//arr排序前:[1 21 1 16 8 123 127 -128 2 -123] 
//arr排序后:[-128 -123 1 1 2 8 16 21 123 127] 
总结:
这个冒泡算法的核心其实就是如何控制外层循环和内层循环的次数和进行数据交换的时机。这里面的泛型的应用,特别是泛型数据类型约束也是比不可少的知识。 

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

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

相关文章

prophet时间序列模型水质预测应用

前言 此前已经分析了&#xff0c;ARIMA 模型在水质预测中的应用&#xff0c;今天用 prophet 模型测试下在水质预测中的效果。 Prophet 简介 Prophet 是 Facebook 于2017年开源的一个时间序列预测框架&#xff0c;特别适合于处理具有明显趋势性和季节性的数据。该模型设计初衷…

领略Java内部类的“内部”

内部类有两种情况&#xff1a; (1) 在类中定义一个类(私有内部类&#xff0c;静态内部类) (2) 在方法中定义一个类(局部内部类&#xff0c;匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类&#xff0c;非静态 我们首先看看类中内部类的两个特点&#xff1a; (1) 在外部…

springboot3项目练习详细步骤(第三部分:文章管理模块)

目录 发布文章 接口文档 业务实现 自定义参数校验 项目参数要求 实现思路 实现步骤 文章列表(条件分页) 接口文档 业务实现 mapper映射 更新文章 接口文档 业务实现 获取文章详情 接口文档 业务实现 删除文章 接口文档 业务实现 文章管理业务表结构…

数据可视化训练第6天(美国人口调查获得关于收入与教育背景的数据,并且可视化)

数据来源 https://archive.ics.uci.edu/dataset/2/adult 过程 首先&#xff1b;关于教育背景的部分翻译有问题。 本次使用字典嵌套记录数据&#xff0c;并且通过lambda在sorted内部进行对某个字典的排序&#xff0c;最后用plotly进行绘图 本次提取数据的时候&#xff0c;用到…

ubuntu server 22.04.4 系统安装详细教程

本教程使用vmware workstation 17创建虚拟机进行安装演示&#xff0c;安装方式和真机安装没有区别。 1、下载镜像 下载ubuntu server版本系统镜像&#xff0c;官网下载地址&#xff1a;https://cn.ubuntu.com/download/server/step1 注意&#xff1a;自己下载时需要确认是否是…

MySQL索引的存储结构

2.3.2. 索引存储结构 索引存储结构有堆表和索引组织表两种方式。 堆表和索引组织表有什么区别&#xff1f; 堆表&#xff1a; 数据和索引是分开存放的&#xff0c;索引是排序后的&#xff0c;但堆数据是无序的进行的都是随机访问&#xff0c;索引的叶子节点中存放的是数据在…

基于springboot + vue 实现的简易博客系统

项目效果图 登陆页面 文章列表 发表文章 用户管理 栏目管理 数据统计 后端技术栈后端主要采用了&#xff1a; 1.SpringBoot 2.SpringSecurity 3.MyBatis 4.部分接口遵循Restful风格 5.MySQL 前端技术栈前端主要采用了&#xff1a; 1.Vue 2.axios 3.Elemen…

每周一算法:传递闭包

题目描述 不等式排序 给定 n n n个变量和 m m m个不等式。其中 n n n小于等于 26 26 26&#xff0c;变量分别用前 n n n 的大写英文字母表示。 不等式之间具有传递性&#xff0c;即若 A > B A>B A>B 且 B > C B>C B>C&#xff0c;则 A > C A>C …

GPU prompt

提问&#xff1a; GPU是如何与CPU协调工作的&#xff1f; GPU也有缓存机制吗&#xff1f;有几层&#xff1f;速度差异是多少&#xff1f; GPU渲染流程有哪些阶段&#xff1f;他们的功能分别是什么&#xff1f; Early-Z技术是什么&#xff1f;发生在哪个阶段&#xff1f;这个…

Cocos 2048从创建到发布上线

二、审核通过之后上线流程 代码通过审核之后&#xff0c;会通过站内信和微信消息发送通知&#xff0c;在管理后台&#xff0c;点击提交发布&#xff0c;去备案

ensp简单ac+ap+sta无线配置和脚本

接入交换机与ap连线配置: interface E0/0/5 port link-type trunk port trunk pvid vlan 10 port trunk allow-pass vlan all配置AC的IP配置&#xff1a; [AC]Vlan 2 创建vlan 2 [AC]interface Vlanif 2 进入vlan 2 [AC-Vlanif2]ip address 192.168.80.3 24 设置一个IP地址…

File类~路径、创建文件对象

路径分为相对路径&#xff08;不带盘符&#xff09;&#xff0c;绝对路径&#xff08;带盘符&#xff09; 路径是可以存在的&#xff0c;也可以是不存在的 创建文件对象的三个方法&#xff1a;

IDEA-SpringBoot项目启动类位置错误导致启动报错

文章目录 前言&#xff1a;本文为SpringBoot项目启动类位置错误导致启动报错解决方案 笔者在初学SpringBoot项目时遇到过因启动类位置错误导致项目启动报错现象&#xff0c;总结如下&#xff1a; SpringBoot启动发送请求后遇到如下错误&#xff1a; Postman界面信息&#xff1…

速了解及使用布隆过滤器

布隆过滤器 介绍 概念&#xff1a;是一种高效查询的数据结构 作用&#xff1a;判断某个元素是否在一个集合中。&#xff08;但是会出现误判的情况&#xff09; 实现原理 加入元素&#xff1a; 当一个元素需要加入到布隆过滤器中时&#xff0c;会使用一组哈希函数对该元素进…

个人模拟面试java2

文章目录 SQL如何进行优化数据库性能调优1. 性能评估2. 确定调优目标 3. 监控和分析4. 硬件和配置调优5. 数据库设计和模式优化6. 查询优化7. 并发控制8. 缓存策略9. 定期维护10. 监控和持续调优 Redis支持哪些数据类型&#xff1f;Redis如何实现持久化&#xff1f;如何解决Red…

☀️提高生产力:这10个Lambda表达式必须掌握!!!

1.使用Lambda表达式进行集合遍历 ❌ 未使用Lambda表达式: List list Arrays.aslist("apple", "banana", "orange"); for (String fruit : list) {System.out.println(fruit); }✅使用Lambda表达式: List list Arrays.aslist("apple&qu…

Dubbo为何放弃JDK SPI机制:一探究竟

引言 在当今的软件开发领域&#xff0c;随着微服务架构的普及和服务化治理的需要&#xff0c;Dubbo作为一款优秀的分布式服务框架&#xff0c;扮演着至关重要的角色。Dubbo以其强大的功能和易用性成为了众多企业和开发者的首选。然而&#xff0c;在Dubbo的设计中&#xff0c;我…

JVM调优:JVM运行时数据区详解

一、前言 Java运行时数据区域划分&#xff0c;Java虚拟机在执行Java程序时&#xff0c;将其所管理的内存划分为不同的数据区域&#xff0c;每个区域都有特定的用途和创建销毁的时间。 其中&#xff0c;有些区域在虚拟机进程启动时就存在&#xff0c;而有些区域则是随着用户线程…

CANape测量分析标定

CANape创建工程及标定 1 创建工程 1. 创建ape工程 打开CANape软件,创建新的ape工程 2.添加数据库文件 通过添加Device(确定信号源)的方式加载数据库文件 A2L:通过添加CCP、 XCP、VX1000的Device DBC:对总线报文检测 CAN CDD: 诊断功能 Diagnostic 如需导入MAP文件…

16. 封装全屏功能

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>封装全屏功能</title><style>#box {…