C++資料結構 15 基數排序
阿新 • • 發佈:2018-11-24
具體的原理可以參考這篇文章:
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; }