我有一个问题。
我有两个数组
int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};
数组b []具有随机顺序的数字,但它们的位置对应于[]中的位置。 例如,num1是index1的值,num2是index2的值。
问题是:
我需要按降序对b []元素进行排序,同时我需要根据b []的排序顺序移动a []元素位置。
我可以使用排序算法之一按降序对b []进行排序,但是我无法根据b []位置变化处理a []元素的同时移动。 我期待的最终输出是[]索引按b []中的值的降序排列。
请帮忙。
由于
答案 0 :(得分:7)
int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};
int c[] = {{num1, index1}, {num2, index2}...{indexI, numI}}
sort(c);
for i = 0 to c.len
print c[i][1]
在c ++中,我会使用一对矢量。在其他语言中,您可以使用结构。
答案 1 :(得分:2)
如果我认为它是正确的,你想要这样的东西a = [0 1 2]; b = [5 2 8]并且在排序后a = [1 0 2]; b = [2 5 8]。
在更改数字位置时,您必须记住更改索引数组的哪种排序算法:
例如。交换两个位置(伪代码)
swap(i, j): // i, j - indexes
(b[i], b[j]) = (b[j], b[i]) // swap values
(a[i], a[j]) = (a[j], a[i]) // swap the indexes
答案 2 :(得分:1)
排序b
后,您可以通过在a
中查找值的比较函数对b
进行排序。
// 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];
}
答案 3 :(得分:1)
您可以通过两种方式完成此操作:首先,使用您最喜欢的排序算法对a
进行排序,但不要直接将a[i]
与a[j]
进行比较,而是将b[a[i]]
与b[a[j]]
进行比较{1}}。现在根据b
中的索引重新安排a
- 您就完成了。
第二步可能如下(伪代码):
var c = new int[b.length]
for (int i = 0 ; i != a.length ; i++)
c[i] = b[a[i]]
b = c
答案 4 :(得分:1)
这显示了使用并行数组而不是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);
答案 5 :(得分:1)
使用qsort,您将使用以下比较表达式对数组a进行排序:
b[*(int*)elem1] - b[*(int*)elem2]
其中elem1和elem2是比较器函数的两个指针参数(让b在函数中可见)。
这将使数组b不受影响,b [a [i]]将按降序给出b元素。