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

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

具体实现方法看大佬博客 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值