基数排序(C++模板)&&计数排序(C++模板)

在学习后缀数组时发现一个非常有趣的排序 具体咋有趣不知,个人认为有意思

具体实现方法看大佬博客 https://blog.csdn.net/weixin_39408343/article/details/107115403

**我这里就专心码我的板子 **

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

你可能感兴趣的:(排序)