Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法

简介: 本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。

 

一、案例目标

本案例将使用最经典的排序算法之一——冒泡排序(Bubble Sort),对一组整数进行从小到大的排序。通过本案例,掌握基本排序思维与切片操作,为后续掌握更复杂的排序算法打基础。


二、应用场景举例

  • • 排序成绩、价格、分数等数据
  • • 理解常见算法执行原理
  • • 后续学习快速排序、归并排序、堆排序的基础

三、涉及知识点讲解

知识点 说明
切片 []int Go中常用的动态数组
冒泡排序原理 相邻元素两两比较,大的往后交换
双层 for 循环 控制轮次与元素比较

四、🛠 实现需求

  1. 1. 用户输入一组整数(用空格分隔);
  2. 2. 程序将这些数字进行冒泡排序;
  3. 3. 输出排序前与排序后的数组;
  4. 4. 包含基础的错误处理(输入不规范);

五、完整代码实现

package main
import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)
func main() {
    fmt.Println("请输入一组整数(用空格分隔):")
    reader := bufio.NewReader(os.Stdin)
    input, _ := reader.ReadString('\n')
    // 字符串转整数切片
    nums, err := parseInput(input)
    if err != nil {
        fmt.Println("输入有误,请只输入整数!")
        return
    }
    fmt.Println("排序前:", nums)
    bubbleSort(nums)
    fmt.Println("排序后:", nums)
}
// 冒泡排序核心逻辑
func bubbleSort(arr []int) {
    n := len(arr)
    for i := 0; i < n-1; i++ {
        // 提前结束标志位
        swapped := false
        for j := 0; j < n-i-1; j++ {
            if arr[j] > arr[j+1] {
                // 交换
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = true
            }
        }
        // 若没有发生交换,说明已经有序
        if !swapped {
            break
        }
    }
}
// 将输入字符串转为整数切片
func parseInput(input string) ([]int, error) {
    fields := strings.Fields(input)
    var nums []int
    for _, f := range fields {
        n, err := strconv.Atoi(f)
        if err != nil {
            return nil, err
        }
        nums = append(nums, n)
    }
    return nums, nil
}

六、运行示例

示例输入:

请输入一组整数(用空格分隔):
9 3 5 1 8

输出结果:

排序前: [9 3 5 1 8]
排序后: [1 3 5 8 9]

七、核心算法解释

冒泡排序的基本思路是:

  • • 每次遍历将当前最大值“冒泡”到末尾
  • • 每轮比较的次数逐渐减少
  • • 若一轮中未发生交换,则提前结束(优化点)

图示演示:

初始:[9 3 5 1 8]
第一轮:[3 5 1 8 9]
第二轮:[3 1 5 8 9]
第三轮:[1 3 5 8 9]
第四轮:无交换,提前退出

八、 拓展练习建议

  1. 1. 实现从大到小排序;
  2. 2. 改为选择排序、插入排序;
  3. 3. 排序对象为字符串数组;
  4. 4. 改写为支持浮点数排序;
  5. 5. 统计交换次数与比较次数;

九、常见错误提示

错误描述 说明
忘记冒泡排序的循环条件 会导致数组越界或逻辑出错
不使用交换变量,直接赋值 arr[i] = arr[j] 会破坏原数据
输入非整数 strconv.Atoi 会返回错误,需处理

小结

通过本案例你掌握了:

  • • 如何接收用户一组数据输入
  • • 如何将字符串解析为整数切片
  • • 如何使用冒泡排序对数组进行排序
  • • 如何在Go中进行值交换与切片操作

冒泡排序虽然效率不高,但逻辑清晰,是理解“比较+交换”类排序算法的入门利器。


 

相关文章
|
1月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
84 2
|
1月前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
173 0
|
1月前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
174 0
|
1月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
140 15
|
1月前
|
存储 缓存 算法
如何管理员工上网:基于 Go 语言实现的布隆过滤器访问拦截算法应用
布隆过滤器以空间换时间,通过多哈希函数实现黑名单的高效存储与毫秒级检索,解决传统方案内存占用大、响应慢等问题,助力企业低成本、高效率管理员工上网行为。
122 3
|
2月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
115 3
|
4月前
|
存储 算法 编译器
Go语言实战案例-括号匹配算法
本文介绍了如何使用栈(Stack)数据结构解决括号匹配问题,适用于编译器、表达式求值和代码格式化等场景。内容涵盖问题描述、算法思路、Go语言实现、复杂度分析及进阶扩展,帮助理解栈在实际编程中的应用。
|
4月前
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
120 0
|
4月前
|
搜索推荐
冒泡排序与其它排序算法比较
本内容比较了冒泡排序、选择排序和插入排序的特性。三者时间复杂度均为O(n²),但交换次数和稳定性不同。冒泡排序稳定,交换次数多,可优化至O(n);选择排序不稳定,交换次数少;插入排序交换次数最少,且二者均为稳定排序。对于有序数组,冒泡和插入可优化提升效率。
99 0
|
1月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
197 0

热门文章

最新文章