桶排序和基数排序实现
作者:
我是高情商
,
2024-07-25 20:25:28
,
所有人可见
,
阅读 2
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100010;
int q[N];
int n,s[N],w[N];
//桶排序(计数排序)
// 时间复杂度:O(n+m);
//空间复杂度:O(n+r);
//稳定
void buckrt_sort()
{
for(int i=0;i<n;i++)s[q[i]]++;//统计每个桶里的元素
for(int i=1;i<N;i++)s[i]+=s[i-1];//计算前缀和
//从后往前放,保证相对位置不变
for(int i=n-1;i>=0;i--)w[--s[q[i]]]=q[i];
for(int i=0;i<n;i++)q[i]=w[i];
}
//基数排序
// 时间复杂度:O(d(n+r);d为位数(log级别)
//空间复杂度:O(n+r);//n为辅助数组,r为桶的长度
//稳定。每一步都是桶排序
void radix_sort(int d,int r)
{
int radix=1;
//从低位到高位
for(int i=1;i<=d;i++)
{
for(int j=0;j<r;j++)s[j]=0;
for(int j=0;j<n;j++)s[q[j]/radix%r]++;
for(int j=0;j<r;j++)s[j]+=s[j-1];
for(int j=n-1;j>=0;j--)w[--s[q[j]/radix%r]]=q[j];
for(int j=0;j<n;j++)q[j]=w[j];
radix *= r; //做完后做下一位
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>q[i];
// buckrt_sort();
radix_sort(10,10);
for(int i=0;i<n;i++)cout<<q[i]<<" ";
}