首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不使用动态内存分配的情况下实现Bucket排序和计数排序

在不使用动态内存分配的情况下实现Bucket排序和计数排序
EN

Stack Overflow用户
提问于 2020-11-07 04:46:09
回答 1查看 139关注 0票数 0

我在C++中练习排序算法,我应该在不使用向量的情况下实现算法。因此,未排序数组的大小可以在开始的#define ARR_SIZE 25上决定,元素是从均匀分布的随机数中选择的。

代码语言:javascript
复制
void Sorters::InitializeArray()
{
for (int i = 0; i < ARR_SIZE; i++) {
    arr[i] = uniformRandom.RandomlyDistribute(LOWER_ARRAY_LIMIT, UPPER_ARRAY_LIMIT);
    }
}

随机数的下界是#define LOWER_ARRAY_LIMIT 0,上界是#define UPPER_ARRAY_LIMIT 200。我实现了一个冒泡排序,它是

代码语言:javascript
复制
void Sorters::BubbleSort(int arr[], int arraySize)
{
for (int k = 0; k < arraySize; k++)
    for (int i = 0; i < arraySize - k - 1; i++)
        if (arr[i] > arr[i + 1]) {
            temporaryVal = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temporaryVal;
        }
}

但是,我在Bucket Sort和Counting Sort上遇到了麻烦。我该如何实现它们呢?在Bucket Sort中,我如何决定每个bucket的大小,因为它不是动态的?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-11-08 03:03:49

存储桶排序:

您可以就地进行存储桶排序,因此不需要分配额外的空间。只需根据二进制表示进行桶排序即可。下面是伪代码:

代码语言:javascript
复制
bucket_sort_int(arr, lower, upper, bit):
    if bit == -1:
        return
    
    l, u = lower, upper
    while l < u:
        if ~bitmask(bit) & arr[l]:
            l++
        else if bitmask(bit) & arr[u]:
            u--
        else:
            arr[l], arr[u] = arr[u], arr[l]
            l++
            u--

    bucket_sort_int(arr, lower, u, bit - 1)
    bucket_sort_int(arr, u + 1, upper, bit - 1)

bucket_sort(arr):
    bucket_sort_int(arr, 0, len(arr) - 1, sizeof(arr[0]) * 8 - 1)

基本上,简单地按最高有效位对数组进行分区,按下一个最高有效位对每个分区进行排序,然后递归地应用此方法,直到对整个数组进行排序。

计数排序:

无论如何,arr中可能的值的范围都需要事先知道。因此,无论如何都不需要使用动态数组。只需使用预定义长度的全局数组和标准算法,就可以了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64721372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档