Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组的种类及其位置_C_Arrays_Algorithm_Sorting - Fatal编程技术网

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]