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

Sort an array based on members of another array in C++

本文关键字:数组 排序 成员 C++ 另一个 根据      更新时间:2023-10-16

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

我有:

int* array1;
double* array2. 
array1=new int[10];
array2=new double[10];
array1=filledWithIntegers(random);
array2=filledWithDoubles(random);

在这里,我想根据数组 2 值对 array1 进行排序。我正在尝试使用 stdlib 的 qsort 函数。qsort(array1,6, sizeof(int), compare);

关键是如何基于 array2 为订单数组 1 制作比较函数。

不能

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

谢谢。

不是对 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("%dn", res[i]);
    }
    return 0;
}

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

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

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

比较函数可以是:

bool compare(const pair<int,double>& t1, const pair<int,double>& t2){
    return (t1.second < t2.second);
}