阵列及其位置

时间:2012-02-16 10:17:52

标签: c arrays algorithm sorting

我有一个问题。

我有两个数组

int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};

数组b []具有随机顺序的数字,但它们的位置对应于[]中的位置。 例如,num1是index1的值,num2是index2的值。

问题是:

我需要按降序对b []元素进行排序,同时我需要根据b []的排序顺序移动a []元素位置。

我可以使用排序算法之一按降序对b []进行排序,但是我无法根据b []位置变化处理a []元素的同时移动。 我期待的最终输出是[]索引按b []中的值的降序排列。

请帮忙。

由于

6 个答案:

答案 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元素。