排序方法
基数排序
基本原理
(1)创建10个桶分别给每位数0~9
(2)遍历每个数位(个、十、百。。。)
(3)遍历每个元素
(4)将元素移到相应的桶中
(5)每个桶从最小数位开始
(6)当桶不为空
(7)将元素恢复到数列中
按照个位,0~9依次放入桶中
从桶中依次放回原数列中
按照十位,0~9依次放入桶中
从桶中依次放回原数列中
按照百位…
代码实现
//求最高数位
int getmaxbit(vector<int> &arr)
{
int n=arr.size();
int max=1;
for(auto x:arr)
{
int d=1;
while(x/10)
{
d++;
x/=10;
if(d>max)
{
max=d;
}
}
}
return max;
}
void radixsort(vector<int> &arr)
{
int n=arr.size();
int bit=getmaxbit(arr);
vector<int> result(n,0);
for(int i=0;i<bit;i++)
{
/*2315求个位数:2315/1%10;
求十位数2315/10%10;
求百位数:2315/100%10;
求千位数:2315/1000%10;*/
vector<int> count(10,0);//每轮需要初始化桶
int division=pow(10,i);
for(int j=0;j<n;j++)
{
int num=arr[j]/division%10;
count[num]++;
}
/*例如count[0]=2,count[1]=3,count[2]=0,
count[3]=4,count[4]=1
经过下面的数组累加之后count[0]=2,
count[1]=5,count[2]=5,count[3]=9,count[4]=10
假设原来数组arr={1,1,0,0,1,4,3,3,3,3}
数4的位置是coun[4]-1
*/
for(int m=1;m<10;m++)
{
count[m]=count[m-1]+count[m]; //计算数的位置
}
for(int k=n-1;k>=0;k--) //注意必须从后往前遍历
{
int num=arr[k]/division%10;
result[count[num]-1]=arr[k];
count[num]--;
}
//每一轮需要将result中元素放回原序列中
for(int i=0;i<n;i++)
{
arr[i]=result[i];
}
}
}