基数排序
按照不同数位排序,数列绝对顺序改变但相对顺序不变。例如,对于十位排序后,对于十位相同的数,个位大小仍是有序排列。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int map[10][5],b[120],a[120],n,step,m; void Counting_Sort(int deep) { if(deep>step) return; memset(b,0,sizeof(b)); int p; for(int i=1;i<=n;i++) { p=a[i]; for(int j=1;j<deep;j++) p/=10; p%=10; b[p]++; map[p][b[p]]=a[i]; } int x=0; for(int i=0;i<=9;i++) { for(int j=1;j<=b[i];j++) { a[++x]=map[i][j]; } } Counting_Sort(deep+1); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); m=max(m,a[i]); } step=log10(m)+1; Counting_Sort(1); for(int i=1;i<=n;i++) { printf("%d ",a[i]); } }