排序系列之冒泡排序

miloyang
0 评论
/ /
527 阅读
/
1996 字
10 2023-07

冒泡排序,顾名思义,谁大(小)谁冒泡,谁大谁往后,或者往前面排。

谁大谁排后面

释义

首先确定是需要两个循环,外层循环控制整体循环几次,里层循环找到最大数且往后排。
具体如下图,只是阐述了里层的一次循环:
选择排序过程图示

代码

func BubbleSort(arr []int) {
    for i := len(arr) - 1; i > 0; i-- { //只是循环len-1次,因为倒数第二次的时候,第一位肯定是最小值
        for j := 0; j < i; j++ { // 随着排序的进行,大的数都在后面,所以j<i即可
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
            fmt.Println(arr)
        }
        fmt.Println("---------------------")
    }
}

打印

[12 20 24 3 18]
[12 20 24 3 18]      
[12 20 3 24 18]      
[12 20 3 18 24]      
---------------------
[12 20 3 18 24]      
[12 3 20 18 24]      
[12 3 18 20 24]      
---------------------
[3 12 18 20 24]      
[3 12 18 20 24]      
---------------------
[3 12 18 20 24]      
---------------------

谁小谁排前面

图就不画了,见文知意,里层循环把每次最小的往前面排,外层循环控制总体循环数量。也就是里层的一次循环就会找到当前最小值往前排。

代码

func BubbleSort2(arr []int) {
    for i := 0; i < len(arr); i++ { // 外层前面开始循环
        for j := len(arr) - 1; j > i; j-- { // 里层从后面开始循环,外层循环过的就不需要再交换位置了,所以j>i,因为最小的都在前面
            if arr[j] < arr[j-1] {
                arr[j], arr[j-1] = arr[j-1], arr[j]
            }
            fmt.Println(arr)
        }
        fmt.Println("---------------------")
    }
}

结果如下:

[20 12 24 3 18]
[20 12 3 24 18]      
[20 3 12 24 18]      
[3 20 12 24 18]      
---------------------
[3 20 12 18 24]      
[3 20 12 18 24]      
[3 12 20 18 24]      
---------------------
[3 12 20 18 24]      
[3 12 18 20 24]      
---------------------
[3 12 18 20 24]      
---------------------

时间复杂度为 O(N^2)

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步