9

我的问题是下一个(是一个显示问题的简单示例):

我有:

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),比较);

重点是如何在array2的基础上对array1进行排序的比较函数。

不能使用 std 库数据结构,必须直接在数组指针中完成。

谢谢。

4

3 回答 3

8

不是对 的整数进行array1排序,而是使用比较项目对它们的索引进行排序array2[index],然后array1根据从排序中得到的排列重新排列。

这是一个快速演示

#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;
}
于 2012-05-14T14:06:38.633 回答
3

是的。您需要将两个数组组合成一对数组,然后定义比较函数。

比较函数可以是:

bool compare(const pair<int,double>& t1, const pair<int,double>& t2){
    return (t1.second < t2.second);
}
于 2012-05-14T14:05:47.867 回答
3

好吧,您只需要使用元素的位置来索引比较函数中的另一个数组(标准保证比较函数的指针参数始终指向要排序的数组):

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有同样的问题,但您可以通过使用封装依赖数组的比较函子来获得更多的通用性/抽象性。

于 2012-05-14T14:27:49.070 回答