1. 程式人生 > >排序演算法--氣泡排序(bubble sort)

排序演算法--氣泡排序(bubble sort)

氣泡排序是一個簡單的排序演算法,演算法複雜度n的平方,特點是兩兩比較,每次遍歷會將最大值或最小值放在最後,像冒泡一樣,每次的最大值或最小值,逐漸冒出,故名氣泡排序;

程式碼如下

void swap( int& a,int& b)
{//資料交換的函式,這裡另類了一點,沒有定義中間變數交換值
    a=a+b;
    b=a-b;
    a=a-b;
}
void bubble(int a[],n)
{
    for(int i=0;i<n-1;i++)//遍歷的次數
    {
        for(int j=0;j<n-j-i;j++)//每次遍歷進行兩兩比較
        {
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]);
        }
    }
}

其實,大家應該可以發現一個問題,假如a陣列是{1,2,4,3,5,6,7,8},這樣的陣列,上面的程式碼其實第一次遍歷就可以完成排序,而不用再進行其他無用的遍歷,造成浪費。

所以就出現了氣泡排序的優化版本:

void swap( int& a,int& b)
{//資料交換的函式,這裡另類了一點,沒有定義中間變數交換值
    a=a+b;
    b=a-b;
    a=a-b;
}
void bubble(int a[],n)
{//其實優化版本僅僅就是增加一個flag,來表示是否有序了
    bool flag=true;//必須設定為true,這樣才能進入第一次迴圈
    for(int i=0;i<n-1 && flag;i++)//遍歷的次數
    {
        flag=false;//改為false,如果有序的話,是不發生交換的,就不用遍歷了
        for(int j=0;j<n-j-i;j++)//每次遍歷進行兩兩比較
        {
            if(a[j]>a[j+1])
            {
                swap(a[j],a[j+1]);
                flag=true;//發生交換了,就需要改為true,進行下一輪的遍歷
            }
        }
    }
}