C 在未排序数组中使用计数排序查找K个最大数
我正在学习如何通过做一些小的在线任务来正确实现计数排序。我写的代码,但它给了我一些原因分段错误。可以看到一个测试输入:C 在未排序数组中使用计数排序查找K个最大数,c,counting-sort,C,Counting Sort,我正在学习如何通过做一些小的在线任务来正确实现计数排序。我写的代码,但它给了我一些原因分段错误。可以看到一个测试输入: n=6,k=4 895142 n=价格数量 k=我想求和的价格数量 因此,这种情况下的输出将为26(因为9+8+5+4) 但是还有一个秘密测试,我看不到输入,当我尝试测试它时,它给出了“分段错误” 我尝试使用malloc,所以我不必定义MAX_缓冲区,但它对我没有帮助 int *countings; int *sorted; max = price[0]; for
n=6,k=4
895142
n=价格数量
k=我想求和的价格数量
因此,这种情况下的输出将为26(因为9+8+5+4)
但是还有一个秘密测试,我看不到输入,当我尝试测试它时,它给出了“分段错误” 我尝试使用malloc,所以我不必定义MAX_缓冲区,但它对我没有帮助
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));
int*计数;
整数*已排序;
最大值=价格[0];
对于(i=1;i使用调试器,在代码开始处设置断点,然后逐步执行。如果任何数组值为<0
或=MAX\u BUFFER
,您将为计数
中断数组索引。但是由于计数
数组未初始化,并且您正在递增其元素,因此很可能会中断数组<代码>排序
。进行一些范围检查以找出错误的地方。使用malloc
而不是定义的数组不会有帮助。尝试int countings[MAX_BUFFER]={0};
@Abdulkareem我希望你的意思是{0}
@Weather Vane是,当我变为7时,它会更新,然后countings[I]+=countings[I-1];
尝试访问未初始化的数组元素
#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;
}