基数ソート(C++テンプレート)&&カウントソート(C++テンプレート)

16860 ワード

接尾辞の配列を学ぶ時1つのとても面白い順序を発見して具体的にどのように面白いか分からないで、個人は面白いと思っています
具体的な実現方法は大物ブログを見る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;
}