[算法初步]之冒泡排序
##1 描述
冒泡排序是一种交换排序的方法。
1)从一个方向开始比较,如果小于后面的数字,则交换位置。直到最小数字被交换到另一端。
2)持续循环,从最小数字一直到最大数字都完成排序。
##2 场景
首选假设一根试管里面有N个气泡,这些气泡都是大小不同的,数字代表大小,但是这些气泡没有排序好的。如下:
* 底层 [3, 5, 1, 7, 6, 2, 11, 13, 4] 上面
我们假设小气泡的浮力比较大,大气泡更容易沉在水滴。但是眼前的这个排列明显不合规矩的,因为我们需要的是大的气泡沉在底下,
而小的气泡浮在上面。这样才符合我们的期望。
很明显,这个状态时不稳定的,必然会发生变化。这个变化的过程就是一个排序的过程。
但是明显的这些气泡没有那么宽阔的视野,他们只能看到旁边的气泡。
从最底层开始,气泡开始躁动上浮了。他们会从最底下的那个,开始向上比较,如果发现自己个头小了,就会挤着上面的气泡交换位置。
比如:开始的3号的泡泡和5号的泡泡比较,明显3号的泡泡更小一些,这货就对直接把5号泡泡挤下去了,两者交换了位置。
* [3, 5, 1, 7, 6, 2, 11, 13, 4] (3和5交换)
* [5 ,3, 1, 7, 6, 2, 11, 13, 4]
然后3号泡泡继续和后面的1号气泡比较,发现自己没有1号的泡泡小,浮上不去了。于是这货对1号泡泡说,我先歇会,你先上去吧。
* [5, 3, 1, 7, 6, 2, 11, 13, 4] (3不动,1开始比较)
然后1号泡泡继续往后面比较,如果比后面的小就继续上浮,否则的话就会位置继续接力。在多次交换之后,最小的气泡终于交换到最上面了。
* [5, 3, 1, 7, 6, 2, 11, 13, 4] (1和7交换)
* [5, 3, 7, 1, 6, 2, 11, 13, 4] (1和6交换)
* [5, 3, 7, 6, 1, 2, 11, 13, 4]
....
* [5, 3, 7, 6,2, 11, 13, 4] [1] (最小数字排序完成)
接下来就是循环执行了,将第二小的泡泡浮上来...一直到到所有的气泡都交换到自己的位置。
* [5, 7, 6, 3, 11, 13, 4] [2, 1]
* [7, 6, 5, 11, 13, 4] [3, 2, 1]
* [7, 6, 11, 13, 5] [4, 3, 2, 1]
* [7, 11, 13, 6] [5, 4, 3, 2, 1]
* [11, 13, 7] [6, 5, 4, 3, 2, 1]
* [13, 11] [7, 6, 5, 4, 3, 2, 1]
* [13] [11, 7, 6, 5, 4, 3, 2, 1]
##3 go语言实现:
package main
import "fmt"
/*
* [冒泡排序]场景:
* 一堆N个气泡,从上至下排成一条直线。左边为底下,未排好序。右边为顶层,已排好序。
* 首先,对所有气泡开始判断【N-1次】,由底下至上面,如果比上面的小就交换位置。
* 第一次执行完成,最小的气泡会浮出到最上面。
* 其次,对第2到结束进行判断【N-2次】。如果比上面的小就交换位置。
* 第二次执行完成,第二小的气泡浮到次上面。
* 一直重复进行。共执行N-1次直到所有的气泡排序完成
*/
func BubbleSort(data *[9]int) {
for i := 0; i < len(data)-1; i++ {
// 每次将最小的元素浮出到len-i的位置
for j := 0; j < len(data)-1-i; j++ {
if data[j] < data[j+1] {
// 交换前后元素
data[j], data[j+1] = data[j+1], data[j]
}
}
}
}
func main() {
data := [9]int{3, 5, 1, 7, 6, 2, 11, 13, 4}
BubbleSort(&data)
for x := 0; x < len(data); x++ {
fmt.Print(data[x], ",")
}
fmt.Println()
}