冒泡排序的根本思维就是:从无序序列头部开始,进行两两比拟,依据大小替换地位,直到最初将最大(小)的数据元素替换到了无序队列的队尾,从而成为有序序列的一部分;下一次持续这个过程,直到所有数据元素都排好序。
算法的外围在于每次通过两两比拟替换地位,选出残余无序序列里最大(小)的数据元素放到队尾

上面用流程来形容冒泡排序的运作过程:
假如有一个数组 arr

package mainimport "fmt"func main() {   var arr [5]int = [5]int{-1, 2, 7, 3, 0}}

为了不便示意数据,咱们将
-1设为 A
2 设为 B
7 设为 C
3 设为 D
0 设为 E

  • 第一次大循环
大循环ABCDE小循环两两比拟
-12730
第1次循环-12A和B
.........27B和C
.........37C和D
.........07D和E
后果-12307小循环比拟4次

当进行第 1 循环时,对数组共排了 4
此时后果为 [-1, 2, 3, 0, 7]

  • 第二次大循环
大循环ABCDE小循环两两比拟
-12307
第2次循环-12A和B
.........27B和C
.........03C和D
后果-12037小循环比拟3次

当进行第 2 循环时,对数组共排了 3
此时后果为 [-1, 2, 0, 3, 7]

  • 第三次大循环
大循环ABCDE小循环两两比拟
-12037
第3次循环-12A和B
.........02B和C
后果-10237小循环比拟3次

当进行第 3 循环时,对数组共排了 2
此时后果为 [-1, 0, 2, 3, 7]

  • 第四次大循环
大循环ABCDE小循环两两比拟
-12037
第4次循环-12A和B
后果-10237小循环比拟1次

当进行第 4 循环时,对数组共排了 1
此时后果为 [-1, 0, 2, 3, 7]

总结
设数组长度为 len ,大循环次数为 i, 小循环次数为 j
i = 1 时,j = len - 1 = 4;
i = 2 时,j = len - 2 = 3;
i = 3 时,j = len - 3 = 2;
i = 4 时,j = len - 4 = 1;

能够看出,ij 的关系为 j = len - i
那么用代码示意就是

package mainimport "fmt"func main() {   var arr [5]int = [5]int{-1, 2, 7, 3, 0}      for i := 1; i < len(arr); i++ {  // 大循环      for j := 0; j < len(arr) - i; j++ {  // 小循环,j = len - i         if arr[j] > arr[j+1] {            arr[j], arr[j+1] = arr[j+1], arr[j]         }      }   }   fmt.Println("新的arr = ", arr)}

输入后果就是:

新的a =  [-1 0 2 3 7]