我的问题是下一个(这是一个显示问题的简单示例):
我有:
int* array1;
double* array2.
array1=new int[10];
array2=new double[10];
array1=filledWithIntegers(random);
array2=filledWithDoubles(random);
//这里我想基于array2值对array1进行排序。我正在尝试使用stdlib的qsort函数。 qsort(array1,6,sizeof(int),compare);
关键是如何基于array2为order1生成比较函数。
不可能使用std库数据结构,它必须直接在数组指针中完成。
感谢。
答案 0 :(得分:5)
不是对array1
的整数进行排序,而是使用array2[index]
对其索引进行排序以比较项目,然后根据从排序中返回的排列重新排列array1
。
这是quick demo:
#include <stdio.h>
#include <stdlib.h>
int array1[] = {1, 7, 3, 9, 5};
double array2[] = {1.1, 7.7, 3.3, 9.9, 5.5};
int compare (const void * a, const void * b) {
double diff = array2[*(int*)a] - array2[*(int*)b];
return (0 < diff) - (diff < 0);
}
int main(void) {
int perm[5], i;
int res[5];
for (i = 0 ; i != 5 ; i++) {
perm[i] = i;
}
qsort (perm, 5, sizeof(int), compare);
for (i = 0 ; i != 5 ; i++) {
res[i] = array1[perm[i]];
}
for (i = 0 ; i != 5 ; i++) {
printf("%d\n", res[i]);
}
return 0;
}
答案 1 :(得分:2)
是肯定的。您需要将两个数组分组为一个数组,然后定义比较函数。
比较功能可以是:
bool compare(const pair<int,double>& t1, const pair<int,double>& t2){
return (t1.second < t2.second);
}
答案 2 :(得分:1)
好吧,你只需要使用元素的位置来索引比较函数中的另一个数组(标准保证比较函数的指针参数总是指向要排序的数组):
int compare(const void *a, const void *b)
{
unsigned int i = (const int*)a - array1;
unsigned int j = (const int*)b - array1;
if(array2[i] < array2[j])
return -1;
if(array2[i] > array2[j])
return 1;
return 0;
}
缺点是,比较函数明确需要知道特定的数组,因为它不能采用任何其他参数。
无论如何,我会质疑qsort
的使用,因为你的问题被标记为C ++。尽管std::sort
具有相同的问题,但您可以通过使用封装依赖数组的比较函数来实现更多的通用性/抽象。