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

Posted

技术标签:

【中文标题】在不使用动态内存分配的情况下实现桶排序和计数排序【英文标题】:Implementing Bucket Sort and Counting Sort Without Using Dynamic Memory Allocation 【发布时间】:2020-11-06 20:46:09 【问题描述】:

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

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。我实现了一个冒泡排序,即

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;
        

但是,我在使用桶排序和计数排序时遇到了麻烦。我该如何实施它们?在桶排序中,我将如何确定每个桶的大小,因为它不是动态的?谢谢。

【问题讨论】:

【参考方案1】:

桶排序:

您可以就地进行桶排序,因此无需分配额外的空间。只需根据二进制表示进行桶排序。伪代码如下:

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 中可能值的范围无论如何都需要事先知道。所以无论如何都不需要使用动态数组。只需使用预定义长度的全局数组和标准算法即可。

【讨论】:

感谢您的回答。打扰一下,但是由于我是初学者,所以我需要问一下如何使用~bitmask。如果我要使用“~bitmask(bit)”和“bitmask(bit)”,你有什么小例子吗?另外,就数据类型而言,位的类型应该是什么? @保罗 @Metalian bitmask(n) 只是位 n 的位掩码。所以基本上bitmask(n) = 1 &lt;&lt; n。另请注意,我在上面的代码中更改了bucket_sortbit 现在是 sizeof(arr[0]) * 8 - 1

以上是关于在不使用动态内存分配的情况下实现桶排序和计数排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法 (10.桶排序)

用Java实现计数排序

《数据结构与算法之美》10——排序桶排序计数排序基数排序

桶排序的具体实现及其原理

排序--桶排序计数排序基数排序

计数排序,桶排序,基数排序的python实现