首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中使用计数排序方法实现

如何在C++中使用计数排序方法实现
EN

Stack Overflow用户
提问于 2014-06-20 08:35:09
回答 1查看 92关注 0票数 0

我现在使用计数排序方法进行排序,有关此方法的更详细说明,请参阅排序代码如下:

代码语言:javascript
复制
    #include <iterator>
    #include <limits>

    template <typename iterator>
    void counting_sort(iterator const &begin, iterator const &end)
    {
        typedef std::iterator_traits<iterator>::value_type T;
        T max = std::numeric_limits<T>::max();
        T freq[max+1] = {0};
        iterator it;
        T c;

        for (it = begin; it < end; ++it) {
            freq[*it] += 1;
        }
        for (c = 0, it = begin; c < max; ++c)
            while (freq[c]-- > 0) {
                *it++ = c;
            }
        }
        while (freq[c]-- > 0) {
            *it++ = c;
        }
    }

我很难用密码来进行排序。例如,

代码语言:javascript
复制
  int main(void)
    {
        const int NUM=20;
        unsigned char a[NUM];
        for(int i=0; i<NUM; i++)
            a[i] = i;
        a[0] = 100;
        a[3] = 15;
        std::vector<unsigned char> aArray(a,a+NUM);
        counting_sort(aArray.begin(),aArray.end());
        for(int i=0; i<aArray.size(); i++)
        {
            int value = aArray[i];
            std::cout<<value<<std::endl;
        }

        return 0;
    }

对于T freq[max+1] = {0},我总是有编译错误,错误消息如下:

代码语言:javascript
复制
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0

对如何使用密码有什么想法吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-20 08:52:08

在C++ (而不是od )中,不能声明可变长度的数组。如果max是一个常量,那么表达式将是正确的。这个决定是将一个freq声明为std::freq

代码语言:javascript
复制
std::vector< T > freq( (size_t)max + 1, 0 );

另一件事:max是一个最大的数字,可以用T表示,这就是为什么max+1是非法的。你可以试试这个:

代码语言:javascript
复制
T [ (size_t)std::numeric_limits<T>::max() + 1 ] = {0};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24323120

复制
相关文章

相似问题

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