冒泡排序

水底的氣泡是逐漸上浮的,而不是一下子就到達水面。冒泡排序與之類似,當用冒泡排序算法對一個無序序列升序排序時,后面較小的元素與前面較大的元素逐個交換位置,直到無元素交換為止,則整個序列成為一個有序序列。

冒泡排序的時間復雜度為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 }