簡單易懂的基數排序
阿新 • • 發佈:2017-07-08
關鍵字 tmp digi 神奇 font dig put tchar read
本蒟蒻最近在學習後綴數組,發現其需要借助基數排序來實現,於是便上網學習了一波,很簡單的排序,其主要思想是:把從低位到最高位依次作為關鍵字插入桶中,最後就有序了。它的代碼更是易懂簡單,下附代碼:
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> #include<algorithm> #define N 100010 using namespace std; inline void read(int &x) { x=0; intp=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; }
簡單易懂的基數排序