冒泡排序

水底的气泡是逐渐上浮的,而不是一下子就到达水面。冒泡排序与之类似,当用冒泡排序算法对一个无序序列升序排序时,后面较小的元素与前面较大的元素逐个交换位置,直到无元素交换为止,则整个序列成为一个有序序列。

冒泡排序的时间复杂度为O(n2),空间复杂度为O(1),当原始序列已经有序,则冒泡排序的时间复杂度为O(n)。当待排序序列基本有序时,使用冒泡排序速度往往比较快。

以一个整数序列的为例,冒泡排序过程见下表。

90 29 11 51 38 38 27 95 18 24 52 35 77 93 40 75

待排序序列

11 90 29 18 51 38 38 27 95 24 35 52 40 77 93 75

1趟后的结果

11 18 90 29 24 51 38 38 27 95 35 40 52 75 77 93

2趟后的结果

11 18 24 90 29 27 51 38 38 35 95 40 52 75 77 93

3 趟后的结果

11 18 24 27 90 29 35 51 38 38 40 95 52 75 77 93

4趟后的结果

11 18 24 27 29 90 35 38 51 38 40 52 95 75 77 93

5趟后的结果

11 18 24 27 29 35 90 38 38 51 40 52 75 95 77 93

6趟后的结果

11 18 24 27 29 35 38 90 38 40 51 52 75 77 95 93

7趟后的结果

11 18 24 27 29 35 38 38 90 40 51 52 75 77 93 95

8趟后的结果

11 18 24 27 29 35 38 38 40 90 51 52 75 77 93 95

9趟后的结果

11 18 24 27 29 35 38 38 40 51 90 52 75 77 93 95

10趟后的结果

11 18 24 27 29 35 38 38 40 51 52 90 75 77 93 95

11趟后的结果

11 18 24 27 29 35 38  38 40 51 52 75 90 77 93 95

12趟后的结果

11 18 24 27 29 35 38 38 40 51 52 75 77 90 93 95

13趟后的结果

11 18 24 27 29 35 38 38 40 51 52 75 77 90 93 95

排序完毕


 1 template <typename RandomIterator, typename Compare>
 2 void bubble_sort(RandomIterator first, RandomIterator last, Compare cmp)
 3 {
 4   if(first == last || first + 1 == last) return;
 5   for(bool exchanged = true; exchanged && first != last; ++first)
 6   {
 7     exchanged = false;
 8     for(RandomIterator current = last - 1; current != first; --current)
 9     {
10       RandomIterator prev = current - 1;
11       if(cmp(*current, *prev))
12       {
13          swap(*current, *prev); // 本主页介绍的快排里有swap实现,用于交换两个元素
14          exchanged = true;
15       }
16     }
17   }
18 }