1. 程式人生 > >簡單易懂的基數排序

簡單易懂的基數排序

關鍵字 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;
    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; }

簡單易懂的基數排序