白話經典算法系列之一 冒泡排序的三種實現(轉)

#include<iostream>
using namespace std;

//交換兩個數,這裏用到了引用
void Swap(int &a, int &b)
{
    int temp;

    temp = a;
    a = b;
    b = temp;

    return ;
}


void BubbleSort1(int a[], int len)
{
    int i,j;
    for (i =0 ; i < len; i++)
    {
        for(j = 1; j < len - i; j++)                   // 這層的循環,注意 len - i
        {
            if (a[j-1] > a[j])
            {
                Swap(a[ j-1], a[j]);         
            }

        }
    }
    return ;
}


/* 優化這個版本
 * 設置一個標誌flag, 如果這一趟(某一輪循環)發生了交換,設置爲true;如果有一趟(一輪)沒有發生交換
 * 說明排序已經排好,設置爲false
*/
void BubbleSort2(int a[], int len)
{
    int i, j, k;
    bool flag;

    k = len;                                                  //控制外層循環
    flag = true;                                            //初始時,需要排序
    while(flag)
    {
        flag = false;                                     //設置flag 不需要排序,如果循環裏面把flag置成true了,說明需要操作
        for (j =1 ; j < k; j++)
        {
            if (a[j - 1] > a[j])
            {
                Swap(a[ j-1], a[j]);                       //交換數值
                flag =  true;                               //需要排序操作

            }
        }
       k--;
    }   
    return ;
}

/*如果有10個數的數組,僅前面5個數無序,後面5個已經排序好了且都大於前面的5個數
 * 在第一趟遍歷之後,後面發生的交換的位置必定小於5,且這個位置之後的數據必定已經排好序了
 *記錄下這個位置,第二次只要從數組頭部遍歷到這個位置就行
*/
void BubbleSort3(int a[], int len)
{
    int i, j, k;
    int flag;

    flag = len;                                                //控制外層循環
    while(flag >0)
    {
        k = flag ;      
        flag = 0;
        for (j =1 ; j < k; j++)                         //第一輪循環結束了之後,知道flag後面的數已經拍好了
        {
            if (a[j - 1] > a[j])
            {
                Swap(a[ j-1], a[j]);                       //交換數值
                flag = j;                                    //需要排序操作

            }
        }
    }   
    return ;
}

int main()
{
    int i;
    int N =10;                                                    //數組個數
    int s[10] = {72,6,57,88,60,42,83,73,48,85};         //初始化
    //int s[10] = {48,6,57,60,42,72,73,83,85,88};         //初始化
    for(i = 0;  i < 9; i++)
        cout<< s[i] <<" ";
    cout<<endl;
    //quick_sort(s, 0, 10-1);                                     //快速排序
    //BubbleSort1(s,N);
    //BubbleSort2(s,N);
    BubbleSort3(s,N);
    //輸出排序後的數組
    for(i = 0;  i < 9; i++)
        cout<< s[i] <<" ";

    return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章