我正在学习如何通过执行一些小的在线任务来正确实施计数排序。我写了代码,但是由于某种原因它给了我分割错误。可以看到一个测试输入:
n = 6,k = 4
8 9 5 1 4 2
n =价格数量
k =我要对
求和的价格数量
因此,本例的输出为26(因为9 + 8 + 5 + 4)
但是,还有一个秘密测试,在该测试中我看不到输入,并且在尝试对其进行测试时会出现“分段错误”。
我尝试使用malloc,因此不必定义MAX_BUFFER,但这对我没有帮助。
int *countings;
int *sorted;
max = price[0];
for (i=1; i<n; i++) {
if (max < price[i]) {
max = price[i];
}
}
countings = (int*)malloc(max * sizeof(int));
sorted = (int*)malloc(n * sizeof(int));
这是完整的代码
#include <stdio.h>
#include <stdlib.h>
#define MAX_BUFFER 100
long sum_of_k_biggest_numbers(int price[], int n, int k)
{
int max;
int i;
int countings[MAX_BUFFER];
int sorted[MAX_BUFFER];
int final_price = 0;
max = price[0];
for (i=1; i<n; i++) {
if (max < price[i]) {
max = price[i];
}
}
for (i=0; i<n; i++) {
countings[price[i]]++;
}
for (i=1; i<(max+1); i++) {
countings[i] += countings[i - 1];
}
for (i=(n-1); i>=0; i--) {
sorted[--countings[price[i]]] = price[i];
}
for (i=(n-1); i>=(n-k); i--) {
final_price += sorted[i];
}
return final_price;
}
int main(void)
{
int i, *x, n, k;
scanf("%d %d", &n, &k);
x = (int*)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
scanf("%d", &x[i]);
printf("%ld\n", sum_of_k_biggest_numbers(x, n, k));
return 0;
}
任何人都可以给我提示或告诉我,这可能是什么问题?