C 数组的种类及其位置
我有个问题 我有两个数组C 数组的种类及其位置,c,arrays,algorithm,sorting,C,Arrays,Algorithm,Sorting,我有个问题 我有两个数组 int a[] ={index1,index2,index3...indexI}; int b[] ={num1,num2,num3.......numI}; 数组b[]具有随机顺序的数字,但它们的位置对应于a[]中的位置。 例如,num1是index1的值,num2是index2的值 问题是: 我需要按降序对b[]元素进行排序,同时我需要根据b[]的排序顺序移动a[]元素的位置 我可以使用一种排序算法对b[]进行降序排序,但我无法根据b[]位置的变化处理a[]元素的
int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};
数组b[]具有随机顺序的数字,但它们的位置对应于a[]中的位置。
例如,num1是index1的值,num2是index2的值
问题是:
我需要按降序对b[]元素进行排序,同时我需要根据b[]的排序顺序移动a[]元素的位置
我可以使用一种排序算法对b[]进行降序排序,但我无法根据b[]位置的变化处理a[]元素的同时移动。
我期望的最终输出是a[]索引,它们按b[]中的值降序排列
请帮忙
谢谢
在C++中,我使用一对向量。在其他语言中,你可以使用一个结构。如果我理解正确,你希望有这样的结构a=[0 1 2];b=[5 2 8],排序后a=[1 0 2];b=[2 5 8] 哪种排序算法在更改编号位置时必须记住更改索引数组: 例如,交换两个位置(伪代码)
排序完
b
后,可以通过在b
中查找值的比较函数对a
进行排序
// assuming b is visible at the module level, you can pass this to qsort
int compare_by_indexing_into_b(void const *a, void const *b)
{
int i = *(int const *)a;
int j = *(int const *)b;
return b[i] - b[j];
}
您可以通过两种方式进行排序:首先,使用您最喜欢的排序算法对
a
进行排序,但不要直接将a[i]
与a[j]
进行比较,而是将b[a[i]
与b[a[j]
进行比较。现在,根据a
中的索引重新排列b
——就完成了
第二步可能如下所示(在伪代码中):
这显示了使用并行数组而不是struct数组的缺点之一。简单的解决方案是将代码转换为
struct {int index, num;} a[] = {{index1, num1},{index2, num2}, ...};
如果您的代码库已经大量使用并行数组,那么您可以编写一个知道这些困难的排序。您可以向它传递一个数组数组,而不是单个数组,并编写排序以在每个数组之间执行其交换,同时只对第一个数组执行比较。换言之:
void sort_pa(void **arrays/*NULL-terminated*/, int len,int size, int(*cmp)(...)))
然后您将使用:
int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};
int *c[] = {b, a, NULL};
sort_pa(c, I, sizeof **c, cmp);
使用qsort,您将使用以下比较表达式对数组a进行排序:
b[*(int*)elem1] - b[*(int*)elem2]
其中elem1和elem2是比较器函数的两个指针参数(让函数可以看到b)
这将使数组b保持不变,而b[a[i]]将按降序给出b元素。任何特定的语言?您可以创建一个结构数组并对其进行排序吗?@Chowlett任何语言都可以:)甚至逻辑或伪代码也可以。谢谢,我想用matlab来做。Matlab不能对向量对进行排序!有什么建议吗?
void sort_pa(void **arrays/*NULL-terminated*/, int len,int size, int(*cmp)(...)))
int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};
int *c[] = {b, a, NULL};
sort_pa(c, I, sizeof **c, cmp);
b[*(int*)elem1] - b[*(int*)elem2]