我需要在整数数组中找到元素的降序。
示例:
如果我有一个数组:
x = {24, 55, 22, 1}
我想在C中使用一个算法来生成数组order
,其中:
order = {2, 1, 3, 4}
考虑到'my'数组x
可能变得相当大(从1k-1M),我的问题如下:如何尽可能高效(快速)地获取order
数组?
显然,必须存在一种有效的算法吗?
答案 0 :(得分:5)
我想更有效的方式是最着名的方式。例如:
答案 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);
}