close

[演算法] 泡沫排序法

泡沬排序法,是依序判斷每個數字,每次判斷之最大數會移到最上方,如泡泡一般,稱為泡沫排序法(Bubble Sort)。

 

例:

 2 12 8 7 39 1

泡沬排序法:

[第一次]

 2 12 8 7 39 1 ( 2是否比12大,否,下一位 )

 2 12  8 7 39 1 ( 12是否比8大,是,交換,下一位 )

 2 8 12 7 39 1 ( 12是否比7大,是,交換,下一位 )

 2 8 7 12 39 1 ( 12是否比39大,否,下一位 )

 2 8 7 12 39 1 ( 39是否比1大,是,交換)

 2 8 7 12 1 39 ( 結果)

第一次排完後,39即被移到最右方,接著再進行第二次排序

 2 8 7 12 1 39  ( 2是否比8大,否,下一位 )

 2 8 7 12 1 39  ( 8是否比7大,是,交換,下一位 )

 2 7 8 12 1 39  ( 8是否比12大,否,下一位 )

 2 7 8 12 1 39  ( 12是否比1大,是,交換 )

 2 7 8 1 12 39 ( 結果)

第二次排完後,12被移到最右方第二位,接下來一直進行排到全部換完為止。

 

提早結束事件

當某一次排序時完全沒發生交換的事件則代表其實已經全部都排列完成了。

例:

 2 12 25 20 

泡沬排序法:

[第一次]

 2  12 25 20 ( 2是否比12大,否,下一位 )

 2 12 25 20 ( 12是否比25大,否,下一位 )

 2 12 25 20 ( 25是否比20大,是,交換)

 2 12 20  ( 結果)

進行第二次排序時,會發現沒有發生任何交換事件,因此可提早結束排序。

程式範例( Linux C ):

 

#include
#include
#include
#include
#include

//---Env define---//
typedef enum Boolean{
false, true
}
bool;

/*************************************************************************/
/*! \struct Leo_bubble
* \brief Leo_bubble function,IN: InputData Input_Number,OUT: None
* \details Leo_bubble function \n
* \author Leo Cheng
*/
/*************************************************************************/

int Leo_bubble(int* InputData,int Input_Number)
{
  int i,j;
  int Buffer = 0;
  int AnswerNumber[Input_Number];
  bool EarlyEnd = true;

  //---Save Input Data to AnswerNumber, and show InputData---//
  for( i=0 ; i   {
    AnswerNumber[i] = *(InputData+i);
    printf("%d ",AnswerNumber[i]);
  }
  printf("\n");

  //---Start Bubble Sort---//
  for( i=0 ; i   {

    EarlyEnd = true;

    for( j=0 ; j     {
      //--Move j to J+1---//
      if(AnswerNumber[j] > AnswerNumber[j+1])
      {
        Buffer = AnswerNumber[j+1];
        AnswerNumber[j+1] = AnswerNumber[j];
        AnswerNumber[j] = Buffer;
        EarlyEnd = false;
      }
    }
    //--Not to move j to j+1 in this time, it's mean all finish---//
    if( EarlyEnd == true )
    {
      break;
    }

  }


  //---Show the answers---//
  for( i=0 ; i   {
    printf("%d ",AnswerNumber[i]);
  }
  printf("\n");
}


/*************************************************************************/
/*! \struct main
* \brief main function,IN: None,OUT: None
* \details main function \n
* \author Leo Cheng
*/
/*************************************************************************/

void main()
{
  int Input_Number = 10;
  int InputData[Input_Number];
  int i;

  srand(time(NULL));
  for( i=0 ; i   {
    InputData[i]=(rand()%100)+1;
  }
 
Leo_bubble(InputData,Input_Number);
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Leo 的頭像
    Leo

    Leo生活筆記

    Leo 發表在 痞客邦 留言(0) 人氣()