[演算法] 基數排序法

基數排序法,是按照位數順序進行排序的一種方法,從個位數開始排序至最大位數稱為LSD(Least sgnificant digital),從最大位數排序至個位數稱為MSD(Most sgnificant digital),利用這種分配性的排列方式,稱為基數排序法(Radix Sort)。

 

例:

 2 12 8 7 39 1

插入排序(LSD):

[第一次]

 1 0 0 3 0 ( 取得個位數,並進行個位數排序 )

1 2 12 8 9 39(結果)

[第二次]

1 2 2 8 9 9 ( 利用個位數排序結果,取得個十數,並進行十位數排序 ,如數不足十位數則為0)

1 2 8 9 12 39(結果)

 

實作時,需要用到較多的Buffer來暫時儲存結果。

 

程式範例( Linux C ):

 

#include
#include
#include
#include
#include

/*************************************************************************/
/*! \struct Leo_Radix
* \brief Leo_Radix function,IN: None,OUT: None
* \details Leo_Radix function \n
* \author Leo Cheng
*/
/*************************************************************************/
int Leo_Radix(int *Data,int Input_Number)
{
  int RadixData[Input_Number];
  int RadixNumberBuffer[Input_Number];
  int RadixDataBuffer[Input_Number];
  int RadixDataBuffer1[Input_Number];
  int i=0,j=0,k=0;

  /*Start in LSD(Least sgnificant digital)*/

  /*Reset with one place*/

  k=0;

  //Get one place from Data to RadixNumberBuffer
  for(i=0;i   {
    RadixNumberBuffer[i] = Data[i] - (Data[i]/10)*10;
  }
  //Get one place in RadixNumberBuffer
  for(i=0;i<=9;i++)
  {
    for(j=0;j     {
      if(RadixNumberBuffer[j] == i)
      {
        RadixDataBuffer[k] = *(Data+j);
        k = k + 1;
      }
    }
  }

  k=0;

  /*Reset with tens place*/

  //Get tens place from RadixDataBuffer to RadixNumberBuffer
  for(i=0;i   {
    if(RadixDataBuffer[i] < 10)
    {
      RadixNumberBuffer[i] = 0;
    }
    else
    {
      RadixNumberBuffer[i] = RadixDataBuffer[i]/10;
    }
  }

  //Get tens place in RadixNumberBuffer
  for(i=0;i<=9;i++)
  {
    for(j=0;j     {
      if(RadixNumberBuffer[j] == i)
      {
        RadixDataBuffer1[k] = RadixDataBuffer[j];
        k = k + 1;
      }
    }
  }

  //---Show InputData---//
  for(i=0;i   {
    printf(" %d",*(Data+i));
  }
  printf("\n");
  //---Show Answer---//
  for(i=0;i   {
    printf(" %d",RadixDataBuffer1[i]);
  }
  printf("\n");
  return 0;
}

/*************************************************************************/
/*! \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 < Input_Number ; i++ )
  {
    InputData[i]=(rand()%100)+1;
  }
  Leo_Radix(InputData,Input_Number);
}

文章標籤
全站熱搜
創作者介紹
創作者 Leo 的頭像
Leo

Leo生活筆記

Leo 發表在 痞客邦 留言(1) 人氣(1,162)