首页 数组排序-冒泡排序
文章
取消

数组排序-冒泡排序

冒泡排序是一种很基础和简单的数组排序方法,采用双层循环,内层循环每次将最大或最小的值“冒泡”到内层循环范围内的最左侧或最右侧,这样两层循环结束后就是有序的数组。“冒泡”的过程其实是交换完成的,通过交换将最值移动到数组的最左端或最右端。所以冒泡排序其实也属于交换排序。

冒泡排序的时间复杂度为 \(O(n^2)\)。

升序排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 冒泡排序,升序
func bubbleSortAsc(data []int) []int {
	for i := 0; i < len(data)-1; i++ {
    // 从左到右遍历
		for j := i + 1; j < len(data); j++ {
      // 将 i 右侧的最小值移动到 i 右侧的最左侧
			if data[i] > data[j] {
				data[i], data[j] = data[j], data[i]
			}
		}
	}
	return data
}

对交换的判断条件 if data[i] > data[j] 做下修改即可实现倒序排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 冒泡排序,降序
func bubbleSortDesc(data []int) []int {
	for i := 0; i < len(data)-1; i++ {
    // 从左到右遍历
		for j := i + 1; j < len(data); j++ {
      // 将 i 右侧的最大值移动到 i 右侧的最左侧
			if data[i] < data[j] {
				data[i], data[j] = data[j], data[i]
			}
		}
	}
	return data
}

上面的升序排序是外层从左到右、内层从左到右,也可以改为外层从右到左,内层从左到右:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 冒泡排序,升序
func bubbleSortAsc(data []int) []int {
	for i := len(data) - 1; i > 0; i-- {
		// 从右到左排序
		for j := 0; j < i; j++ {
			// 将 i 左侧的最大值移动到 i 左侧的最右侧
			if data[i] < data[j] {
				data[i], data[j] = data[j], data[i]
			}
		}
	}
	return data
}
本文由作者按照 CC BY 4.0 进行授权