数据结构与算法 排序算法 冒泡排序

排序算法之冒泡排序

一、原理

冒泡排序(BubbleSort)是一种简单的排序算法。

每次遍历数组,从前往后比较相邻两个数的大小

相邻两个元素A和B,如果A > B,则交换A与B的值,同时指针移动到原本B所在的位置

一次遍历之后,最大的元素就会处于数组的末尾

第二次遍历之后,第二大的元素处于倒数第二个位置

重复这个操作,直到整个数列有序

 

注意:

第一轮比较次数:数组总长度 - 1

下一轮的比较次数:当前一轮比较次数 - 1

外层循环:比较轮数

内层循环:每轮比较次数及交换

 二、图解

 

三、时间复杂度和稳定性

最好时间复杂度:$O(n)$

数组已经有序,比较次数和交换次数都是最小值

最坏时间复杂度:$O(n^2)$

数组是逆序的,每一趟排序,都要进行比较,比较次数和交换次数都是最大值

平均时间复杂度:$O(n^2)$

稳定性:稳定

排序之前,a[i]在a[j]之前,排序之后,a[i]仍在a[j]前面,所以这个排序算法是稳定的。

四、实现

4.1 C++实现

 1 template<class T>
 2 void Swap(T &a, T &b)
 3 {
 4     T tmp = a;
 5     a = b;
 6     b = tmp;
 7 }
 8 
 9 template<class T>
10 void bubbleSort(T *arr, int length)
11 {
12     for (int i = 0; i < length - 1; ++i)
13     {
14         for (int j = 0; j < length - i - 1; ++j)
15         {
16             if (arr[j] > arr[j + 1])
17             {
18                 Swap(arr[j], arr[j + 1]);
19             }
20         }
21     }
22 }
View Code

 

4.2 Java实现

 

五、优化

看图解的时候很明显能看到,第四趟排序完成后,数组已经是有序的了,但是循环仍然在进行,进行第5,6,7...次排序

然而并没有必要,所以可以添加一个标志变量

如果发生了交换,就说明这个数组不是有序的

如果没发生交换,就说明这个数组已排好序,可以退出循环

 

5.1 C++实现

 1 template<class T>
 2 void Swap(T &a, T &b)
 3 {
 4     T tmp = a;
 5     a = b;
 6     b = tmp;
 7 }
 8 
 9 template<class T>
10 void bubbleSort(T *arr, int length)
11 {
12     int flag;
13     for (int i = 0; i < length - 1; ++i)
14     {
15         flag = 0;
16         for (int j = 0; j < length - i - 1; ++j)
17         {
18             if (arr[j] > arr[j + 1])
19             {
20                 Swap(arr[j], arr[j + 1]);
21                 flag = 1;
22             }
23         }
24         if (flag == 0)
25         {
26             break;
27         }
28     }
29 }
View Code

5.2 Java实现

 

posted @ 2019-10-15 09:34  47的菠萝~  阅读(480)  评论(0编辑  收藏  举报