相当好的一个动画点击打开链接
看两遍就知道怎么做了。
思想是先根据每位数的个位排序,然后根据十位排序,然后百位,以此类推
就好像我们比较两个数大小,先看最高位,然后依次看低一位,例如321,311,如果出现一位不同,那么下面的位数就不用看了
3==3,然后2>1,个位的1==1不用看,所以322>311,那么排序自然相反(因为每一次排序都是建立在之前排序的基础上,
所以,后面排序的显然更为重要,这就和两个数比较的时候高位更重要联系起来,所以从低位到高位排序)
这里根据某一位排序时,用到的是计数排序的方法。。
mdzz自己随机了几组实例验证(a【i】只要大于100)都出错了,还以为哪里的问题,结果是(int)pow(10,i)掉精度,真是 ╯^╰ ,注:(int)pow(10,2)=99
void Bucket(int *a,int len,int base,int *c)
{
int bkt[10]={0};
for(int i=0;i<len;i++)
bkt[(a[i]/base)%10]++;
for(int i=0;i<9;i++)
bkt[i+1]+=bkt[i];
for(int i=len-1;i>=0;i--)
{
int t=(a[i]/base)%10;
c[--bkt[t]]=a[i];
}
for(int i=0;i<len;i++)
a[i]=c[i];
}
int Pow(int p,int q)
{
int ans = 1;
while(q)
{
if(q&1)
ans=p*ans;
p=p*p;
q/=2;
}
return ans;
}
void Basesort(int *a,int len)
{
int* c=new int[len];
int maxx=a[0];
for(int i=1;i<len;i++)
if(maxx<a[i])maxx=a[i];
int t=0;
while(maxx)maxx/=10,t++;
for(int i=0;i<t;i++)
Bucket(a,len,Pow(10,i),c);
}
洛谷p1177快速排序
/*author:revolIA*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7,mod = 1e9+7;
int n,Max=-1e9;
int a[maxn],b[maxn],c[10];
void radixSort(int a[],int n,int base){
memset(c,0,sizeof c);
for(int i=0;i<n;i++)c[(a[i]/base)%10]++;
for(int i=0;i<9;i++)c[i+1]+=c[i];
for(int i=n-1;~i;i--)b[--c[(a[i]/base)%10]] = a[i];
for(int i=0;i<n;i++)a[i]=b[i];
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]),Max = max(Max,a[i]);
int cnt = (!Max)?1:0;
while(Max)Max /= 10,cnt++;
for(int i=0,p=1;i<cnt;i++,p*=10)radixSort(a,n,p);
for(int i=0;i<n;i++)printf("%d%c",a[i],i==n-1?'\n':' ');
return 0;
}
然后 心血来潮写个二进制的、比较慢、
/*author:revolIA*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7,mod = 1e9+7;
int n,Max=-1e9;
int a[maxn],b[maxn],c[2];
void radixSort(int a[],int n,int base){
c[0] = c[1] = 0;
for(int i=0;i<n;i++)c[((a[i]>>base)&1)]++;
c[1] += c[0];
for(int i=n-1;~i;i--)b[--c[((a[i]>>base)&1)]] = a[i];
for(int i=0;i<n;i++)a[i]=b[i];
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]),Max = max(Max,a[i]);
int cnt = (!Max)?1:0;
while(Max)Max >>= 1,cnt++;
for(int i=0;i<cnt;i++)radixSort(a,n,i);
for(int i=0;i<n;i++)printf("%d%c",a[i],i==n-1?'\n':' ');
return 0;
}