排序算法之冒泡排序

来源:互联网 发布:压缩密码破解软件 编辑:程序博客网 时间:2024/05/29 19:05

冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。[1]

维基百科冒泡排序动态图[2]

C++实例代码如下

#include <iostream>using namespace std;void BubbleSort(int arr[],int n)//n是数组长度{    for(int i=0;i<n;i++)        for(int j=n-2;j>=i;j--)        {            if(arr[j]>arr[j+1])            {                int temp=arr[j+1];                arr[j+1]=arr[j];                arr[j]=temp;            }        }}int main(){    const int n=9;    int a[n]={3,5,2,4,7,9,8,1,6};    BubbleSort(a,n);    cout << "After sorted : ";    for(int k=0;k<n;k++)        cout << a[k] << " ";    return 0;}

于是得到以下结果
bubblesort1
如果想仔细观察冒泡排序的每一步的过程,适当修改代码如下:

#include <iostream>using namespace std;void BubbleSort(int arr[],int n)//n是数组长度{    for(int i=0;i<n;i++)        for(int j=n-2;j>=i;j--)        {            cout << "\n第" << i+1 << "轮," << n-1-j << "次冒泡 :";            if(arr[j]>arr[j+1])            {                int temp=arr[j+1];                arr[j+1]=arr[j];                arr[j]=temp;            }            for(int k=0;k<n;k++)                cout << arr[k] << " ";        }}int main(){    const int n=9;    int a[n]={3,5,2,4,7,9,8,1,6};    cout << "Before sorted :  ";    for(int k=0;k<n;k++)        cout << a[k] << " ";    BubbleSort(a,n);    cout << "\nAfter sorted : ";    for(int k=0;k<n;k++)        cout << a[k] << " ";    return 0;}

得到结果如下:

bubblesort2

从数字的移动可以看出,冒泡排序之冒泡的含义了。

从上面的图也可以看出,第三轮,在已经排好序的情况下,冒泡排序仍然在继续排序,所以该算法效率的确不高。可以考虑设置一个布尔标记量,当第二个for循环里面已经排好序,无需再进入第一个for循环。

于是稍微修改一下:

#include <iostream>using namespace std;void BubbleSort(int arr[],int n)//n是数组长度{    bool flag=true;    for(int i=0;i<n&&flag;i++)        for(int j=n-2;j>=i;j--)        {            flag=false;            cout << "\n第" << i+1 << "轮," << n-2-j << "次冒泡 :";            if(arr[j]>arr[j+1])            {                int temp=arr[j+1];                arr[j+1]=arr[j];                arr[j]=temp;                flag=true;            }            for(int k=0;k<n;k++)                cout << arr[k] << " ";        }}int main(){    const int n=9;    int a[n]={3,5,2,4,7,9,8,1,6};    cout << "Before sorted :  ";    for(int k=0;k<n;k++)        cout << a[k] << " ";    BubbleSort(a,n);    cout << "\nAfter sorted : ";    for(int k=0;k<n;k++)        cout << a[k] << " ";    return 0;}

结果如下:

bubblesort3

下面来分析冒泡排序的时间复杂度。

  • 最好的情况是完全正序。有了布尔标记量的情况下,此时只需要完成第一个for循环,需要O(n)次比较,无需进入下面的第二个for循环,因此时间复杂度是O(n)。
  • 最坏的情况是逆序,对每一个i,都要循环n-i次,比较次数是O(n2),交换次数也是O(n2),因此时间复杂度是O(n2)。

参考文献
[1] [2] 冒泡排序维基百科

0 0
原创粉丝点击