使用未排序数组中的计数排序查找K个最大数字

时间:2019-10-06 18:00:19

标签: c counting-sort

我正在学习如何通过执行一些小的在线任务来正确实施计数排序。我写了代码,但是由于某种原因它给了我分割错误。可以看到一个测试输入:
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;
}

任何人都可以给我提示或告诉我,这可能是什么问题?

0 个答案:

没有答案