[算法初步]之冒泡排序 ##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() }