首页 > 代码库 > 简单易懂的基数排序
简单易懂的基数排序
本蒟蒻最近在学习后缀数组,发现其需要借助基数排序来实现,于是便上网学习了一波,很简单的排序,其主要思想是:把从低位到最高位依次作为关键字插入桶中,最后就有序了。它的代码更是易懂简单,下附代码:
#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; }
简单易懂的基数排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。