【发布时间】:2019-11-03 23:04:09
【问题描述】:
我希望按照第一个数组对第二个数组进行排序。例如
first = {1,8,7,2,4}
second = {9,7,2,10,3}
我希望第一个保持不变,第二个按照与第一个相同的相对顺序进行排序。即最低值在索引 0 处,第二低值在索引 3 处,第三低值在索引 4 处等等
second = {2,10,9,3,7}
我已经尝试了以下代码
#include <stdio.h>
typedef struct
{
int num;
int pos;
}ArrType;
ArrType arrA[5] = {{1,0},{8,1},{7,2},{2,3},{4,4}};
ArrType arrB[5] = {{9,0},{7,1},{2,2},{10,3},{3,4}};;
int cmparr(const void *a, const void *b)
{
ArrType *tmpa, *tmpb;
tmpa = (ArrType*) a;
tmpb = (ArrType*) b;
return(arrA[tmpa->pos].num - arrA[tmpb->pos].num);
}
int main(void)
{
int i;
qsort(arrB,5, sizeof(ArrType), cmparr);
for (i=0; i<5; i++)
{
printf ("%d ",arrB[i].num);
}
return (0);
}
实际输出是
9 10 3 2 7
我对不同的数据结构持开放态度,但arrB 应该只排序一次。
我在 C++、Javascipt 和其他语言中看到了一些解决方案。但是在 C 中没有解决方案。
编辑 - 这些数组在最终程序中会非常大。我正在寻找一个单一的排序操作。即单个呼叫qsort
【问题讨论】:
-
实际输出不如预期。
cmparr函数或使用的数据结构有问题。 -
@Socowi - 我已经指定了预期的输出
second = {2,10,9,3,7} -
@Socowi 我相信它更像是:您检查
first的顺序,所以最低的是位置0,接下来是位置3,依此类推。然后您将此顺序应用于second,以便您搜索最低值并将其放置在位置 0 然后您搜索下一个值并将其放置在位置 3 等等。 -
@Socowi 对不起,现在我理解你的评论,你说得对
-
@Ranon 您不会通过单个排序操作找到解决方案。由于您隐含地需要能够回答“数组中最大的元素是什么元素?”这个问题。您要么需要对它们都进行排序,要么搜索它们——对未排序数组进行更昂贵的操作。
标签: c arrays algorithm sorting