一、什么是冒泡排序
冒泡排序和选择排序很相似,选择排序是通过比较选择出最小的,放在第一位作为有序部分,然后不断补充完整。
而冒泡排序则是两两比较,将大的放在后面,通过一轮比较,将较大的放在靠后的位置,所以它和选择排序的区别在于,选择排序需要一个 minIndex 作为记录,记录最小的,然后再交换。冒泡排序则是直接比较直接交换,不需要 minIndex。
思路:
- 根据上面所说,冒泡排序的有序部分在数组(以数组为例)的最末位,所以,我们需要让外层循环不断 - - ,知道只剩下最后一个,也就是当 i = 0 的时候,i 则默认是最小的一个值(照这个逻辑,其实我们也可以把最小的放在前面,正着比较,但是本人喜欢反着来)
- 由最末位的两个位置的数,两两比较,将大的放在后面,这样一轮之后(一轮指外层循环的一轮),较大的数就都在数组的后排了
二、代码实现
话不多说,上代码:
package sort
import (
"log"
"testing"
)
func TestBubbleSort(t *testing.T) {
arr := []int{5, 1, 1, 3, 2, 0}
log.Println(arr)
bubbleSort(arr)
log.Println(arr)
}
// bubbleSort
func bubbleSort(arr []int) {
if arr == nil || len(arr) < 2 {
return
}
n := len(arr)
// 外层循环控制循环次数
// 内层循环执行真正的代码逻辑
for i := n; i > 0; i-- {
for j := 0; j < i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}