c - 不使用 vector 、指针和计数排序的桶排序实现

标签 c sorting bucket-sort

我们要使用桶排序对1到2001之间的数字进行排序。数字的个数可以是10E6。

我知道桶排序算法。但问题是,在这道题中,我们不允许使用变长数组、 vector 和指针。 (唯一允许的与指针相关的事情是数组的“按引用传递”)我发现的唯一解决方案是对每个桶使用计数排序,如下面的代码,因此该代码更像是计数排序而不是桶排序:( 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; }

我想知道桶排序是否可以在没有变长数组、 vector 和指针的情况下实现,也可以在没有计数排序的情况下实现。可能使用插入或冒泡排序。注意,它必须是一个合理的桶排序算法。因此定义像 int bucket [201][1000000]; 这样非常大的存储桶也是一种 Not Acceptable 方法。

最佳答案

鉴于您无法使用可变长度数组或指针(桶排序需要其中之一),因此最好的选择是使用计数排序。您只有 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]--;
    }
}

关于c - 不使用 vector 、指针和计数排序的桶排序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53270166/

相关文章:

c - 指针类型转换为不同的数据类型

c# - 如何按特定列对 dataGridView 进行降序排序并对其进行排名?

Excel图表: Ordering by values (automatically)

c - 取消引用结构体的双指针时出现问题

linux - 如何在 C 中获取 CPU 和内存使用情况? (在 Linux 系统中)

algorithm - 桶排序的最坏情况复杂度是多少?

algorithm - 什么是桶排序的好散列函数?

c - 硬盘驱动器盘上读取缓存

database - 如何对在 Oracle 中存储为 varchar 的 IP 地址进行排序