[算法初步]之冒泡排序

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



原文地址:https://www.cnblogs.com/sxt102400/p/3022759.html