1. 程式人生 > >C++資料結構 15 基數排序

C++資料結構 15 基數排序

 

 

具體的原理可以參考這篇文章:

http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html

 

程式碼實現:

#include <iostream>
#include <list>
using namespace std;

int maxdixgit(int data[],int n)   //返回數有幾位
{
    int d=1;                //基數的位數
    int p=10;               //開始設值為10,然後進行比較
    for(int i=0;i<n;++i)    //迴圈進行比較檢視幾位數
    {
       while(data[i]>=p)   //檢視數是不是比10要大
       {
           p*=10;           //如果比10大,p的值*10
           ++d;            //d的位數加1
       }
    }
    return d;
}
void radixSort(int data[],int n)  //基數排序
{
  list<int> p[10];
  int s,j,i,x;
  int digit=maxdixgit(data,n);   //先返回數有幾位
  for( i=0,x=1;i<digit;x*=10,++i)   //進行幾次取出,排序
  {
      for( j=0;j<n;j++)  //遍歷所有的數,將數放在連結串列中
      {
          //設一個數為n,則在C語言中其個位、十位、百位、千位依次這樣計算:n/1%10,n/10%10,n/100%10,n/1000%10
          p[(data[j]/x)%10].push_back(data[j]);  //把資料放入連結串列中,x就是數取整的位
      }
      for( s=j=0;j<10;j++)  //將連結串列中的數取出來放入陣列中
      {
          while(!p[j].empty()) //如果連結串列有資料
          {
             data[s++]=p[j].front();  //將資料放入陣列中
             p[j].pop_front();   //刪除連結串列中的資料
          }
      }
      for(int m=0;m<n;m++)      //檢視中間結果
        cout<<data[m]<<' ';
      cout<<endl;
  }
}



int main()
{
    int a[10]={10,45,13,5,9,789,485,659,785,1023};
    radixSort(a,10);
    for(int i=0;i<10;i++)
    {
       cout<<a[i]<<' ';
    }
    cout<<endl;
    // cout << "Hello world!" << endl;
    return 0;
}