我需要按如下方式对数组进行排序:
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