实施计数排序

时间:2011-10-02 19:05:01

标签: c++ sorting

这里是计数排序的代码

#include <iostream>
using namespace std;

int main(){
    int a[]={2,3,1,2,3};
    int n=sizeof(int)/sizeof(int);
    int max=a[0];
    for (int i=1;i<n;i++) {
        if (a[i]>max) { 
            max=a[i];
        }
    }

    int *output=new int[n];
    for (int i=0;i<n;i++) {
        output[i]=0;
    }
    int *temp=new int[max+1];
    for (int i=0;i<max+1;i++) {
        temp[i]=0;
    }
    for (int i=0;i<n;i++){
        temp[a[i]]=temp[a[i]]+1;
    }
    for (int i=1;i<max+1;i++) {
        temp[i]=temp[i]+temp[i-1];
    }
    for (int  i=n-1;i>=0;i--) {
        output[temp[a[i]]-1]=a[i];
        temp[a[i]]=temp[a[i]]-1;
    }
    for (int i=0;i<n;i++) {
        cout<<output[i]<<"  ";
    }
    return 0;
}

但输出只有2,只有一个数字。有什么不对,我无法理解请大家帮帮我

3 个答案:

答案 0 :(得分:2)

int n=sizeof(int)/sizeof(int);

错了。这只会将1分配给n

你的意思是

int n=sizeof(a)/sizeof(int);

我没有超越这个。毫无疑问,存在更多问题,但这是最重要的问题。

使用调试器可以很容易地解决这个问题。

答案 1 :(得分:1)

看看这个表达式:

int n=sizeof(int)/sizeof(int);

您认为n之后的价值是什么? (1)
这是合适的价值吗? (不,值应为5)
这能解释您所看到的输出吗? (是的,这解释了为什么只显示一个数字)

答案 2 :(得分:1)

我的建议是,如果您要在C ++中执行此操作,您实际上会尝试使用C ++中可用的功能来执行此操作。我会查找std::max_element以找到输入中的最大元素,并使用std::vector而不是直接搞乱动态分配。

如果你想在C ++中使用数组中的元素数量,你可能会考虑这样的函数模板:

template <class T, size_t N>
size_t num_elements(T const (&x)[N]) { 
    return N;
}

我没有将所有内容都转储到main中,而是将计数排序编写为一个单独的函数(或者更好的是,一个函数模板,但我暂时不管这个。)

// warning: Untested code:
void counting_sort(int *input, size_t num_elements) { 
    size_t max = *std::max_element(input, input+num_elements);

    // allocate space for the counts.
    // automatically initializes contents to 0
    std::vector<size_t> counts(max+1); 

    // do the counting sort itself.
    for (int i=0; i<num_elements; i++)
        ++counts[input[i]];  

    // write out the result.
    for (int i=0; i<counts.size(); i++)
        // also consider `std::fill_n` here.
        for (int j=0; j<counts[i]; j++)
            std::cout << i << "\t";
}

int main() { 
    int a[]={2,3,1,2,3};

    counting_sort(a, num_elements(a));
    return 0;
}