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

一、案例目标

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


二、应用场景举例

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

三、涉及知识点讲解

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

四、🛠 实现需求

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

五、完整代码实现

go 复制代码
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

输出结果:

css 复制代码
排序前: [9 3 5 1 8]
排序后: [1 3 5 8 9]

七、核心算法解释

冒泡排序的基本思路是:

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

图示演示:

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

八、 拓展练习建议

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

九、常见错误提示

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

小结

通过本案例你掌握了:

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

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


相关推荐
快乐就是哈哈哈13 分钟前
Spring Cloud Alibaba 教程:Nacos 配置中心 + Feign 服务调用一网打尽
后端
追逐时光者3 小时前
精选 5 款 .NET 开源、功能强大的工作流系统,告别重复造轮子!
后端·.net
bobz9654 小时前
Agent AI:多模态交互前沿调查
后端
小厂永远得不到的男人4 小时前
一篇文章搞懂 java 反射
java·后端
蒋星熠4 小时前
Rust 异步生态实战:Tokio 调度、Pin/Unpin 与零拷贝 I/O
人工智能·后端·python·深度学习·rust
公众号_醉鱼Java4 小时前
Elasticsearch文档数迷思:深度解析count与stats背后机制
后端
David爱编程4 小时前
Java 编译期 vs 运行期:避开这些坑,少掉一半 Bug
java·后端
麦兜*4 小时前
Spring Boot调用优化版AI推理微服务 集成 NVIDIA NIM指南
java·人工智能·spring boot·后端·spring cloud·微服务·ai编程
Moonbit5 小时前
# 量子位 AI 沙龙回顾丨用 MoonBit Pilot 解答 AI Coding 的未来
后端
码事漫谈6 小时前
C++ vector越界问题完全解决方案:从基础防护到现代C++新特性
后端