基数排序的相关理论
基数排序(radixsort)则是属于“分配式排序”(distributionsort),基数排序法又称“桶子法”(bucketsort),而桶排序法是一种思想,而不是具体的某种算法。
这种排序算法必须知道所排数据的范围,否则效率就没有高效了。此外还需要额外的内存空间。并且基数排序法是属于稳定性的排序,其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数。
基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:22、 4555、 13、 7、 999
(1)按个位数排序是22、13、4555、7、999
(2)再根据十位排序7、13、22、4555、999
(3)再根据百位排序7、13、22、4555、999
(4)在根据千位排序7、13、22、4555、999
此外,还要考虑负数的情况(这是有符号类型涉及的)
##相关代码:#define base_10 10
//寻找数组中最大的位数
int serch_max(int* p,int length){
int temp=1;
int i=0;
int d=0;
for(int i=0;i<length;i++){
while(p[i]>temp){
temp*=10;
d++;
}
}
return d;
}
//寻找第几位的数值
int seek_pos(int data,int pos){
int temp=1;
for(int i=0;i<pos-1;i++){
temp*=10;
}
return (data/temp)%10;
}
//进行基数排序
void Base_sort(int *p,int length){
//创建一个二维数组进行数据的临时存储
int *temp[base_10];
int d=serch_max(p,length);
int index=0;
for(int i=0;i<base_10;i++){
temp[i]=(int*)malloc(sizeof(int)*(length+1));
temp[i][0]=0;
}
for(int i=1;i<=d;i++){
//将数据分别放入桶中
for(int j=0;j<length;j++){
int snap=seek_pos(p[j],i);
// cout<<snap<<endl;
index=++temp[snap][0];
temp[snap][index]=p[j];
// cout<<temp[snap][index]<<" ";
}
//将桶中的数据由小到大重新安排
for(int i=0,j=0;i<base_10;i++){
for(int k=1;k<=temp[i][0];k++){
p[j++]=temp[i][k];
//j++;
}
temp[i][0]=0;
}
//测试:
/*for(int i=0;i<length;i++){
cout<<p[i]<<" ";
}
cout<<endl;*/
}
}