在学习后缀数组时发现一个非常有趣的排序 具体咋有趣不知,个人认为有意思
具体实现方法看大佬博客 https://blog.csdn.net/weixin_39408343/article/details/107115403
**我这里就专心码我的板子 **
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5;
int dat[maxn];
int tmp[maxn];
int cunt[maxn];
// dat 为原数组
// tmp 为中间数组
// cunt 为计数数组 统计在某次排序中相同桶内元素个数
int main()
{
int n,max_=0,max_w=0;
cin>>n;
for(int i=0;i<n;i++){//读入数据,顺便记录下最大值qaq
cin>>dat[i];
max_=max(max_,dat[i]);
}
while (max_)//算出最大值位数
{
max_/=10;
max_w++;
}
int ide=1;//用来判断在那个桶
for(int i=1;i<=max_w;i++)
{
for(int j=0;j<10;j++)//桶清空
cunt[j]=0;
for(int j=0;j<n;j++)
{
int k=(dat[j]/ide)%10;//在哪个桶
cunt[k]++;
}
for(int j=1;j<10;j++)//认为这应该是此代码最核心部分 讲不清 自行体会吧qaq
cunt[j]+=cunt[j-1];
for(int j=n-1;j>=0;j--)//从n-1开始是为了保证两相同数相对位置不变
{
int k=(dat[j]/ide)%10;
tmp[cunt[k]-1]=dat[j];
cunt[k]--;
}
for(int j=0;j<n;j++)
dat[j]=tmp[j];
ide*=10;
}
for(int i=0;i<n;i++)
cout<<dat[i]<<endl;
return 0;
}
下面是计数排序 **还一直以为是同一个东西 **
具体介绍点这
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5;
const int MAXN=1e5;
int dat[maxn];
int tmp[maxn];
int cunt[MAXN];
// dat 为原数组
// tmp 为结果数组
// cunt 为计数数组 统计在某次排序中相同桶内元素个数
int main()
{
int n,max_=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>dat[i];
max_=max(max_,dat[i]);
}
for(int i=0;i<n;i++)
cunt[dat[i]]++;
for(int i=1;i<=max_;i++)
cunt[i]+=cunt[i-1];
for(int i=n-1;i>=0;i--)
{
tmp[cunt[dat[i]]-1]=dat[i];
cunt[dat[i]]--;
}
for(int i=0;i<n;i++)
cout<<tmp[i]<<endl;
return 0;
}