冒泡排序
1,引入
- 一种简单的排序算法
2,比较轮数 与 每轮的比较次数
-
比如,我们要对
64 34 25 72 22 11 60
这个序列升序排序。 -
冒泡排序的思路是:将序列从左到右,每两个相邻的数都比较一次,如果前者大于后者,就交换这两个相邻数字的位置,这个过程重复多次,就可以将序列变成升序的。拿上面例子来说:
-
想象一下,你走在回家的路上,沿途有各种价值不一的宝物,每次遇到宝物,你总会把手里的宝物和遇到的宝物比较,然后带走价值较大的那一个,当你回到家时,你带来的肯定是价值最大的那一个。这就是上面不断比较然后适时交换想达到的目的。
-
所以第一轮后的必然结果是序列中的最大值被交换到序列最右端:
-
这表示我们第二轮只需要比较到倒数第二个位置,毕竟序列剩余的任何数都比最大值小,比较的结果也必然是不交换。
-
也可以这样理解:第一轮过后,最大值已经被安排在了合适的位置,现在相当于是对前
n-1
个数组成的子序列排序。这种理解对以递归实现冒泡排序很有用。 -
下面继续看第二轮:
-
第二轮排序后的结果:
-
第二轮过后,倒数第二大的数字
64
被交换到了倒数第二个位置上,同样下一轮中我们只比较到倒数第三个位置即可。 -
所以每轮比较的次数都比前一轮少1。
-
另一个问题是:要使整个序列有序最少需要比较多少轮?
-
每轮过后都会将一个当前最大值放到序列右端,
n-1
轮后,剩余的最后一个元素相当于自己组成序列的最大值,无需比较,自然有序,所以最少需要的比较轮数是n-1
(n
是元素总数)
3,实现
3,1, C++代码
- C++实现:
// bubble_sort.cc
void bubble_sort(vector<int>& seq) {