如何获得整数数组的降序(常数)?

时间:2013-10-04 22:12:14

标签: c arrays algorithm sorting

我需要在整数数组中找到元素的降序。

示例:

如果我有一个数组:

x = {24, 55, 22, 1}

我想在C中使用一个算法来生成数组order,其中:

order = {2, 1, 3, 4}

考虑到'my'数组x可能变得相当大(从1k-1M),我的问题如下:如何尽可能高效(快速)地获取order数组? 显然,必须存在一种有效的算法吗?

3 个答案:

答案 0 :(得分:5)

我想更有效的方式是最着名的方式。例如:

  • 为从0到N-1的所有索引分配矢量并初始化
  • 使用一种有效的排序算法(例如quicksortmerge sort对索引向量进行排序,但是通过引用原始数据向量(您对索引进行排序,比较原始数据)

答案 1 :(得分:4)

您可以使用qsort标准功能的比较器功能: http://www.tutorialspoint.com/c_standard_library/c_function_qsort.htm 只需实现比较器以添加间接,即替换:

return ( *(int*)a - *(int*)b );

通过

return (x[*(int*)b] - x[*(int*)a]);

(编辑以降序排列)

#include <stdio.h>
#include <stdlib.h>

int x[] = { 88, 56, 100, 2, 25 };
int indexes[] = { 0, 1, 2, 3, 4};

int cmpfunc (const void * a, const void * b)
{
   return ( x[*(int*)b] - x[*(int*)a] );
}

int main()
{
   int n;

   printf("Before sorting the list is: \n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", indexes[n]);
   }

   qsort(indexes, 5, sizeof(int), cmpfunc);

   printf("\nAfter sorting the list is: \n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", indexes[n]);
   }

  return(0);
}

答案 2 :(得分:0)

我将从stdlib.h中的qsort开始 因为它需要一个指向函数的指针,不会是最快的,但肯定更容易编码。

int v[4] = {24, 55, 22, 1};
int fcmp(const void *a, const void *b) {
    int A = *(const int*)a;
    int B = *(const int*)b;
    if (v[A] > v[B]) return -1;
    if (v[A] < v[B]) return +1;
    return 0;
}

int main(int argc, char *argv[])
{
    int r[4] = {0, 1, 2, 3 };
    qsort(r, 4, sizeof(int), fcmp);
}