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

C 如何获得整数数组的降序(序数)?,c,arrays,algorithm,sorting,C,Arrays,Algorithm,Sorting,我需要找到整数数组中元素的降序 例如: 如果我有一个数组: x = {24, 55, 22, 1} 我想要一个C语言的算法,它可以生成数组顺序,其中: order = {2, 1, 3, 4} 考虑到“我的”数组x可能变得相当大(从1k-1M),我的问题如下:如何尽可能高效(快速)地获得顺序数组? 显然,一定有一种高效的算法可以做到这一点?我想更高效的方法是最广为人知的方法。例如: 为从0到N-1的所有索引分配一个向量并初始化它 使用一种有效的排序算法(例如或)对索引向量进行排序,但参考原

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

例如:

如果我有一个数组:

x = {24, 55, 22, 1}
我想要一个C语言的算法,它可以生成数组
顺序
,其中:

order = {2, 1, 3, 4}
考虑到“我的”数组
x
可能变得相当大(从1k-1M),我的问题如下:如何尽可能高效(快速)地获得
顺序
数组?
显然,一定有一种高效的算法可以做到这一点?

我想更高效的方法是最广为人知的方法。例如:

  • 为从0到N-1的所有索引分配一个向量并初始化它
  • 使用一种有效的排序算法(例如或)对索引向量进行排序,但参考原始数据向量(排序索引,比较原始数据)

您可以使用qsort标准函数的比较器函数: 只需实现比较器以添加间接寻址,即替换:

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

(编辑以获得降序)

#包括
#包括
int x[]={88,56,100,2,25};
int索引[]={0,1,2,3,4};
int cmpfunc(常数无效*a,常数无效*b)
{
返回(x[*(int*)b]-x[*(int*)a]);
}
int main()
{
int n;
printf(“排序前列表为:\n”);
对于(n=0;n<5;n++){
printf(“%d”,索引[n]);
}
qsort(索引,5,sizeof(int),cmpfunc);
printf(“\n排序后列表为:\n”);
对于(n=0;n<5;n++){
printf(“%d”,索引[n]);
}
返回(0);
}
我将从stdlib.h开始 因为它需要一个指向函数的指针,所以它不是最快的,但肯定是最容易编码的

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);
}
intv[4]={24,55,22,1};
整数fcmp(常数无效*a,常数无效*b){
int A=*(常数int*)A;
int B=*(常数int*)B;
如果(v[A]>v[B])返回-1;
如果(v[A]
回答得好。只需添加一些额外的信息:这个方法是O(n*log(n)),由于它受到排序操作的限制,所以没有比O(n*log(n))更好的方法了。@FilipeGonçalves-在哪里,你是如何确定这种效率等级的?(即O(n*log(n))。你有链接吗?@ryker,因为快速排序和合并排序都在O(n*log(n))中运行),这就是整个算法的复杂性…你能详细说明一下吗,因为我在示例代码上测试它时没有使它工作?谢谢,现在我明白了。它总是有帮助的。使用减法,比如你的
返回(*(int*)a-*(int*)b)在<< C++ >代码> >代码>比较函数中,有溢出问题(考虑< <代码> a <代码>是一个大负数,<代码> b>代码>是一个大正数)。“vector”,是指数组?C++在其标准库中有一个类型<代码>向量< /代码>;C没有。(gcc还有一个无关的扩展名,与C++的
std::vector
无关)我当然是指数组。如果我不清楚的话,很抱歉。
#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);
}
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);
}