在c中使用qsort按值最大的索引对数组进行排序



我需要按如下方式对数组进行排序:

int *array = malloc(5*sizeof(int))

我们输入array = [2,4,1,3,2]

index   0 1  2  3   4

我必须对它进行排序,使具有最大值的索引位于最开始,依序递减

所以输出必须是

array =[1, 3, 0, 4, 2]或[1,3,4,0,2](因为索引0和索引4有相同的值)

我知道使用qsort I可以为值排序:

int cmpfunc (const void * a, const void * b) { 

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

qsort(array, 5, sizeof(u32), cmpfunc);

,但是这个的输出将是:

array = [4,3,2,2,1]

您要做的不是对值排序,而是对索引排序。

从值数组开始,然后创建一个数组,其中的值是当前索引号。

那么在排序函数中,得到的值就是原始数组的下标。然后使用这些值来索引原始数组,然后比较这些值。

int order[] = {2, 4, 1, 3, 2};
int cmp(const void *p1, const void *p2)
{
const int *a = p1, *b = p2;
return order[*b] - order[*a];
}
int main()
{
int idx[] = {0,1,2,3,4};
qsort(idx,5,sizeof(int), cmp);
int i;
for (i=0;i<5;i++) {
printf("%dn", idx[i]);
}
return 0;
}

这个例子使用的是固定数组,但是很容易调整为使用动态分配的数组。

输出:

1
3
0
4
2

最新更新