这段代码的运行不符合预期,该怎么改const int B=10; int getmax(int a[],int n) { int maxx=0,b=1; for(int i=1;i<=n;i++) { maxx=max(maxx,a[i]); } while(maxx>=B) { maxx/=B; b++; } return b; } void radix(int a[],int n) { int maxb=getmax(a,n); int e=1; int cnt[B+1]; int tmp[n+1]; for(int i=1;i<=maxb;i++,e*=B) { memset(cnt,0,sizeof(cnt)); for(int j=1;j<=n;j++) { int bucket=(a[j]/e)%B; cnt[bucket]++; } for(int j=2;j<=B;j++) { cnt[j]+=cnt[j-1]; } for(int j=n;j>=1;j--) { int bucket=(a[j]/e)%B; tmp[--cnt[bucket]]=a[j]; } for(int j=1;j<=n;j++) { a[j]=tmp[j]; } } }
时间: 2024-03-14 15:45:05 浏览: 79
2022年全国计算机等级考试二级C++模拟试题(12)上机部分.docx
这段代码是基数排序的实现,其中最大值的获取和桶的数量计算有问题。可以将获取最大值的函数改为如下形式:
```c++
int getmax(int a[],int n) {
int maxx=a[1];
for(int i=2;i<=n;i++) {
if(a[i]>maxx) {
maxx=a[i];
}
}
int b=1;
while(maxx>=B) {
maxx/=B;
b++;
}
return b;
}
```
这样就能够正确地获取最大值了。同时,桶的数量应该是 $B+1$ 而不是 $B$,因为还有一个桶存放余数为 $0$ 的数。因此,应该将桶的数量定义为:
```c++
const int B=10;
const int bucket_num=B+1;
```
然后在代码中也要做相应的更改,比如:
```c++
int cnt[bucket_num];
```
```c++
for(int j=2;j<=bucket_num;j++) {
cnt[j]+=cnt[j-1];
}
```
阅读全文