冒泡排序,顾名思义,谁大(小)谁冒泡,谁大谁往后,或者往前面排。
谁大谁排后面
释义
首先确定是需要两个循环,外层循环控制整体循环几次,里层循环找到最大数且往后排。
具体如下图,只是阐述了里层的一次循环:
代码
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)