基于C ++中另一个数组的成员对数组进行排序

时间:2012-05-14 14:04:13

标签: c++ arrays sorting qsort

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

我有:

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库数据结构,它必须直接在数组指针中完成。

感谢。

3 个答案:

答案 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具有相同的问题,但您可以通过使用封装依赖数组的比较函数来实现更多的通用性/抽象。