这里是计数排序的代码
#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,只有一个数字。有什么不对,我无法理解请大家帮帮我
答案 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;
}