根据 C++ 中另一个数组的成员对数组进行排序
Sort an array based on members of another array in C++
我的问题是下一个(是显示问题的简单示例):
我有:
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);
}
相关文章:
- 显示错误输出的简单数组排序程序
- C 使用单个函数对具有多种值类型的数组排序
- 2D数组排序,空格打乱顺序
- C 2D数组排序
- C++数组排序 - 将"bbba"和"0001"视为不正确排序的问题
- 数组排序功能
- CString 数组排序
- 简单的数组排序/检查 划分和征服版本
- C++ 中的多维数组排序
- 选择在++中对并行数组排序
- C++:二维指针数组排序:选择排序不适用于某些实例
- C++字符串数组排序
- C++中的指针数组排序算法
- 在VC++6中使用向量进行数组排序时出错,而在VC++2012中没有错误
- 将索引数组排序为主数组
- 数组排序、数组输入、数组输出
- C++数组排序,内存错误
- 在嵌入式系统上将数组排序功能从c++移植到c
- 基于其他int数组排序
- 多维数组排序c++奇怪行为