排序思路:放一次取一次
1.创建(0~9)10个“桶”(队列);
2.遍历数组中的每个元素,从个位开始将数组元素放至相应号的桶中(如6501放进1号桶,1234放进4号桶);
3.再将每个桶中的元素拿出,当桶不是空的时候,在每个桶中,根据队列先进先出,依次将元素拿出放进数组;
4.再根据(百位,千位…),将元素放进对应的桶中,重复上面的步骤(放取次数根据最大元素的位数决定),最后一次取出放进数组后就排序好了。
代码的实现:
void radixSort(int arr[],int N){
/*遍历找出数组中最大元素*/
int max = arr[0];
for(int i=0;i<N;i++){
if(arr[i]>max){
max = arr[i];
}
}
/*求最大元素长度*/
int maxLength = 0;
while(max > 0){
max /= 10;
maxLength++;
}
/*创建(0~9)10个桶子*/
int bucket[10][N];
/*记录每个桶中有多少个元素,先将每个桶中元素个数置0*/
int bucketElementCounter[N];
for(int i = 0;i < N;i++){
bucketElementCounter[i] = 0;
}
/*按个位,百位~放入对应桶中*/
for(int i = 0,t =1;i < maxLength;i++,t*=10){
for(int j = 0;j < N;j++){
/*记录每轮排序各元素对应的桶号*/
int num_bucket = arr[j]/t%10;
/*放入桶*/
bucket[num_bucket][bucketElementCounter[num_bucket]++] = arr[j];
}
/*取出(放一次取一次)*/
for(int i = 0,j = 0,n = 0;i < 10;i++){
if(bucketElementCounter[i]!=0){
while(bucketElementCounter[i]){
arr[n++]=bucket[i][j++];
bucketElementCounter[i]--;
}
/*置零,保证每次从桶底的元素开始取出(队列:先进先出)*/
j = 0;
}
}
}
}