基數排序
基數排序是一個複雜度突破了O(nlogn)的排序算法
優點:快
缺點:需要額外空間一倍,只是用與整數
原理:一次按照數據的最低位,次底位……最高位進行排序,利用桶子來進行。
見代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5;
inline int getdigit(int *v,int n)//獲取數據中最大的位數
{
int d=1,bas=10;
for(int i=0;i<n;++i)
{
while(v[i]>=bas)
{
++d;
bas*=10;
}
}
return d;
}
void LSD(int *v,int n)
{
int bas=1;
int d=getdigit(v,n);
int *temp=new int[n];//臨時數組
while(d--)
{
int cnt[10]={0};
int id;
for(int i=0;i<n;++i)//求出每個桶的大小
{
id=v[i]/bas%10;
cnt[id]++;
}
int st[10]={0};//
for(int i=1;i<10;++i)//在臨時數組上分配位置
st[i]=st[i-1]+cnt[i-1];
for(int i=0;i<n;++i)//把數據按照桶子的記錄,搬到臨時數組
{
id=v[i]/bas%10;
temp[st[id]++]=v[i];
}
memcpy(v,temp,n*sizeof(int));//搬回原數組
bas*=10;
}
delete [] temp;
}
int main()
{
int a[10];
srand(time(0));
for(int i=0;i<10;++i)
a[i]=rand()%20+1;
for(int &x:a)
cout<<x<<" ";
cout<<endl;
LSD(a,10);
for(int &x:a)
cout<<x<<" ";
cout<<endl;
}