[TOC] ## 算法介绍 时间复杂度都是:`O(n^2)` 现在有一堆乱序的数,比如:`5 9 1 6 8 14 6 49 25 4 6 3`。 第一轮迭代:从第一个数开始,**依次比较相邻的两个数**,如果前面一个数比后面一个数大,那么交换位置,直到处理到最后一个数,最后的这个数是最大的。 第二轮迭代:因为最后一个数已经是最大了,现在重复第一轮迭代的操作,但是只处理到倒数第二个数。 第三轮迭代:因为最后一个数已经是最大了,最后第二个数是次大的,现在重复第一轮迭代的操作,但是只处理到倒数第三个数。 第N轮迭代:.... ``` []表示排好序 {}表示比较后交换的结果 第一轮开始: 4 2 9 1 从第一个数开始,4 比 2 大,交换 4,2 第一轮: {2 4} 9 1 接着 4 比 9 小,不交换 第一轮: 2 {4 9} 1 接着 9 比 1 大,交换 9,1 第一轮: 2 4 {1 9} 已经到底,结束 第一轮结果: 2 4 1 [9] 第二轮开始:2 4 1 [9] 从第一个数开始,2 比 4 小,不交换 第二轮: {2 4} 1 [9] 接着 4 比 1 大,交换 4,1 第二轮: 2 {1 4} [9] 已经到底,结束 第二轮结果: 2 1 [4 9] 第三轮开始:2 1 [4 9] 从第一个数开始,2 比 1 大,交换 2,1 第三轮: (1 2} [4 9] 已经到底,结束 第三轮结果: 1 [2 4 9] 结果: [1 2 4 9] ``` ## 实例 <details> <summary>描述</summary> ``` package main import "fmt" func BubbleSort(list []int) { n := len(list) // 在一轮中有没有交换过 didSwap := false // 进行 N-1 轮迭代 for i := n - 1; i > 0; i-- { // 每次从第一位开始比较,比较到第 i 位就不比较了,因为前一轮该位已经有序了 for j := 0; j < i; j++ { // 如果前面的数比后面的大,那么交换 if list[j] > list[j+1] { list[j], list[j+1] = list[j+1], list[j] didSwap = true } } // 如果在一轮中没有交换过,那么已经排好序了,直接返回 if !didSwap { return } } } func main() { list := []int{5, 9, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3} BubbleSort(list) fmt.Println(list) //[1 3 4 5 6 6 6 8 9 14 25 49] } ``` </details> <br/> 冒泡排序是效率较低的排序算法,可以说是最慢的排序算法了,我们只需知道它是什么,在实际工作上切勿使用如此之慢的排序算法!