如何获取数组前N个值的索引?

时间:2014-08-23 06:18:40

标签: c

我有一个包含数字的大尺寸数组,有没有办法找到前n个值的索引? C?

中的任何lib函数

示例:

一个数组:{1,2,6,5,3}

前两位数的指数为:{2,3}

2 个答案:

答案 0 :(得分:5)

如果top n表示数组中n - 最高(或最低)的数字,您可能需要查看QuickSelect算法。不幸的是,没有C库函数我知道实现它,但维基百科应该给你一个很好的起点。

QuickSelect平均为O(n),如果O(nlogn)和一些开销也很好,你可以qsort并取n'元素。

编辑(作为回应示例)使用这两种方法,在单个批次中获取top-n的所有索引都很简单。 QuickSelect将它们全部分类到最终枢轴的一侧。

答案 1 :(得分:2)

所以你想要N个数字的大数组中的前n个数字。有一种简单的算法,即O(N * n)。如果n很小(看起来像你的情况那样),那就足够了。

size_t top_elems(int *arr, size_t N, size_t *top, size_t n) {
  /*
     insert into top[0],...,top[n-1] the indices of n largest elements 
     of arr[0],...,arr[N-1]
  */
  size_t top_count = 0;
  size_t i;
  for (i=0;i<N;++i) {
    // invariant: arr[top[0]] >= arr[top[1]] >= .... >= arr[top[top_count-1]]
    // are the indices of the top_count larger values in arr[0],...,arr[i-1]
    // top_count = max(i,n);
    size_t k;
    for (k=top_count;k>0 && arr[i]>arr[top[k-1]];k--);
    // i should be inserted in position k
    if (k>=n) continue; // element arr[i] is not in the top n
    // shift elements from k to top_count
    size_t j=top_count;
    if (j>n-1) { // top array is already full
      j=n-1;
    } else { // increase top array
      top_count++;
    }
    for (;j>k;j--) {
      top[j]=top[j-1];
    }
    // insert i
    top[k] = i;
  }
  return top_count;
}