基数排序的神秘问题, 求解
查看原帖
基数排序的神秘问题, 求解
985711
NightDiver楼主2023/7/27 17:29
#include <iostream>
#include <cstring>

#define N 100005

using namespace std;

int n,a[N],tmp[N],cnt[20];

void radix_sort(int d){
	int radix=1;
	for(int k=1;k<=d;++k){
		memset(cnt,0,sizeof(cnt));
		for(int i=1;i<=n;++i){
			++cnt[(a[i]/radix)%10];
		}
		for(int i=0;i<10;++i){
			cnt[i+1]+=cnt[i];
		}
		for(int i=n;i>=1;--i){
			int t=(a[i]/radix)%10;
			tmp[cnt[t]]=a[i];
			--cnt[t];
		}
		for(int i=1;i<=n;++i){
			a[i]=tmp[i];
		}
		radix*=10;
	}
}

int num(int x){
	int res=0;
	while(x)x/=10,++res;
	return res;
}

int main(){
	cin>>n;
	int maxx=-2e9;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		maxx=max(maxx,a[i]);
	}
	radix_sort(num(maxx));
	for(int i=1;i<=n;++i){
		cout<<a[i]<<" ";
	}
//	cout<<endl;
	return 0;
}

若把radix_sort中的memset去掉,则会re,加上就ac。 但是在这个

for(int i=n;i>=1;--i){
			int t=(a[i]/radix)%10;
			tmp[cnt[t]]=a[i];
			--cnt[t];
		}

循环中,cnt数组不应该已经全部变为0了吗?

求解答

2023/7/27 17:29
加载中...