首页 > 代码库 > 简单易懂的基数排序

简单易懂的基数排序

  本蒟蒻最近在学习后缀数组,发现其需要借助基数排序来实现,于是便上网学习了一波,很简单的排序,其主要思想是:把从低位到最高位依次作为关键字插入桶中,最后就有序了。它的代码更是易懂简单,下附代码:

#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;
}

 

简单易懂的基数排序