我们要使用存储桶排序对1到2001之间的数字进行排序。数字的计数可以是10E6。
我知道存储桶排序算法。但是问题在于,在这个问题中,我们不允许使用可变长度数组,向量和指针。 (唯一允许与指针相关的事情是数组的“按引用传递”)我发现的唯一解决方案是对每个存储桶使用计数排序,例如下面的代码,因此该代码更像是计数存储而不是存储桶排序:( C语言)
#include <stdio.h>
int buckets[201][10]={}; int numbers[1000001]={};
void bucket_sort (int a[],int n) {
for (int i =0;i<=n-1;i++)
{
int index = a[i]/10, index2 = a[i]%10;
buckets[index][index2]++;
}
int counter =0;
for (int i =0;i<=200;i++)
{
for (int j =0; j<=9;j++)
{
while (buckets[i][j])
{
a[counter] = i*10+j;
counter++;
buckets[i][j]--;
}
}
} }
int main() {
int n;
scanf("%d",&n);
if (n==0)
{
return 0;
}
for (int i =0;i<=n-1;i++)
{
scanf("%d",&numbers[i]);
numbers[i];
}
bucket_sort(numbers,n);
for (int i =0;i<=n-1 ;i++)
{
printf("%d\n", numbers[i]);
}
return 0; }
我想知道是否可以在不使用可变长度数组,向量和指针以及不计算排序的情况下实现存储桶排序。可能使用插入或冒泡排序。请注意,它必须是合理的存储桶排序算法。因此,定义像int bucket [201][1000000];
这样的大型存储桶也是一种不可接受的方法。
答案 0 :(得分:0)
鉴于您不能使用可变长度数组或指针,对于存储桶排序,必须使用其中之一,最好的选择是使用计数排序。您只有2000个可能的值,因此创建一个大小为2000的数组,并为找到的每个值递增相应的数组元素。
void counting_sort(int a[], int n)
{
int count[2002] = { 0 };
int i, j;
for (i=0; i<n; i++) {
count[a[i]]++;
}
for (i=0, j=0; i<n; i++) {
while (!count[j]) {
j++;
}
a[i] = j;
count[j]--;
}
}