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;
}