冒泡排序

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

冒泡排序的時(shí)間復(fù)雜度為O(n2),空間復(fù)雜度為O(1),當(dāng)原始序列已經(jīng)有序,則冒泡排序的時(shí)間復(fù)雜度為O(n)。當(dāng)待排序序列基本有序時(shí),使用冒泡排序速度往往比較快。

以一個(gè)整數(shù)序列的為例,冒泡排序過(guò)程見(jià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趟后的結(jié)果

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

2趟后的結(jié)果

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

3 趟后的結(jié)果

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

4趟后的結(jié)果

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

5趟后的結(jié)果

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

6趟后的結(jié)果

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

7趟后的結(jié)果

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

8趟后的結(jié)果

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

9趟后的結(jié)果

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

10趟后的結(jié)果

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

11趟后的結(jié)果

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

12趟后的結(jié)果

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

13趟后的結(jié)果

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); // 本主頁(yè)介紹的快排里有swap實(shí)現(xiàn),用于交換兩個(gè)元素
14          exchanged = true;
15       }
16     }
17   }
18 }