本蒟蒻最近在学习后缀数组,发现其需要借助基数排序来实现,于是便上网学习了一波,很简单的排序,其主要思想是:把从低位到最高位依次作为关键字插入桶中,最后就有序了。它的代码更是易懂简单,下附代码:
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> #include<algorithm> #define N 100010 using namespace std; inline void read(int &x) { x=0; int p=1; char c=getchar(); while(!isdigit(c)){if(c==‘-‘)p=-1;c=getchar();} while(isdigit(c)) {x=(x<<1)+(x<<3)+(c^‘0‘);c=getchar();} x*=p; }//快速读入 int a[N]; int n; int c[11];//作为桶 int maxn; int tmp[N]; int main() { read(n); for(int i=1;i<=n;i++) read(a[i]),maxn=max(maxn,a[i]);//统计最大数,方便计算最高位 int d=1;//位数 int ws=10; while(maxn%ws!=maxn)d++,ws*=10;//一种计算位数比较神奇的方法(看其他博客的dalao都是写了一段函数,我一行就写完了QAQ) for(int i=1;i<=d;i++) { int cs=pow(10,i-1); memset(c,0,sizeof(c)); for(int j=1;j<=n;j++)c[a[j]/cs%10]++;//取出每一位并放入桶中 for(int j=0;j<=n;j++)c[j]+=c[j-1]; for(int j=n;j>=1;j--) { tmp[c[a[j]/cs%10]]=a[j];//把顺序存入临时数组 c[a[j]/cs%10]--; } memcpy(a,tmp,sizeof(a)); } for(int i=1;i<=n;i++) printf("%d ",a[i]); puts(""); return 0; }
时间: 2024-09-28 09:07:38