是一種非比較型整數排序算法,其原理是將整數按位數切割成不一樣的數字,而後按每一個位數分別比較。因爲整數也能夠表達字符串(好比名字或日期)和特定格式的浮點數,因此基數排序也不是隻能使用於整數。基數排序的發明能夠追溯到1887年赫爾曼·何樂禮在打孔卡片製表機(Tabulation Machine)上的貢獻[1]。php
它是這樣實現的:將全部待比較數值(正整數)統一爲一樣的數位長度,數位較短的數前面補零。而後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成之後, 數列就變成一個有序序列。ios
好比這樣一個數列排序: 342 58 576 356, 如下描述演示了具體的排序過程(紅色字體表示正在排序的數位)算法
第一次排序(個位):字體
3 4 2spa
5 7 6blog
3 5 6排序
0 5 8ip
第二次排序(十位):ci
3 4 2字符串
3 5 6
0 5 8
5 7 6
第三次排序(百位):
0 5 8
3 4 2
3 5 6
5 7 6
結果: 58 342 356 576
#include<iostream> #include<math.h> using namespace std; //默認數據都是天然數 int data[8]={123,9,0,78,56,234,1223,78}; //獲得數字的倒數第N位 void getNofData(int ds[],int NofData[],int n,int length){ int *tempDS=(int *)malloc(sizeof(int)*length); for(int i=0;i<length;i++) tempDS[i]=ds[i]; for(int i=0;i<n;i++){ for(int j=0;j<length;j++){ NofData[j]=tempDS[j]%10; tempDS[j]=tempDS[j]/10; } } } int myRadixSort(int ds[],int length){ //find the max of ds int max=ds[0]; for(int i=1;i<length;i++) if(ds[i]>max) max=ds[i]; //判斷最大位數 int maxBits=1; while(max=max/10) maxBits+=1; int *NofData=(int *)malloc(sizeof(int)*length); for(int i=1;i<=maxBits;i++){ getNofData(ds,NofData,i,length); //如下是插入排序 //從第二個元素開始掃描 for(int i=1;i<length;i++){ //若是當前元素大於已排序元素,跳出循環,從下一元素開始執行 //這次將插入排序,作小小改動,將">"改成">=" if(NofData[i]>=NofData[i-1]) continue; //保存當前元素,將已排序的最後一個元素後移(已比較過) int temp=NofData[i]; int tempDS=ds[i]; ds[i]=ds[i-1]; NofData[i]=NofData[i-1]; //從已排序的倒數第二個元素開始(若是有的話) int j=i-2; for(;j>=0;j--) //若是當前元素大於要插入元素,當前元素向後移,不然跳出 if(NofData[j]>temp){ ds[j+1]=ds[j]; NofData[j+1]=NofData[j]; } else break; //插入待排序元素 NofData[j+1]=temp; ds[j+1]=tempDS; } } return 0; } int main(){ myRadixSort(data,8); for(int i=0;i<8;i++) cout<<data[i]<<" "; getchar(); return 0; }