问题描述
大家好,我正在c上工作,我的代码看起来像这样,基本上是一个数组,并且在每个数组中[j]都有一个从1到8的数字,顺序不对,我正在尝试找出1是,并执行一些操作,然后找到2并执行其他操作,等等。直到数字8:
for(i=1;i<9;i++)
for(j=0;j<8;j++)
if(array[j]==i)
//and operations to do but they are not needed now;
我正在寻找另一种方法来完成此任务,因为它的复杂性可能是(n ^ 2),因此花费的时间更少。有人给我提供了一种方便的系统来订购商品,但我不知道它是否足够好。 谢谢大家!
解决方法
Quicksort的平均复杂度为O(n log(n))。 按索引对对(值,索引)进行排序,以便可以在O(1)中访问它们。
struct pair
{
int val;
int index;
};
int pair_compare(const void* a,const void* b)
{
struct pair* x = (struct pair*)a;
struct pair* y = (struct pair*)b;
return x->val > y->val;
}
int main()
{
int arr[8] = {4,2,1,3,6,5,8,7};
struct pair* pairs = (struct pair*) calloc(8,sizeof(*pairs));
int i;
for(i = 0; i < 8; ++i)
{
pairs[i].val = arr[i];
pairs[i].index = i;
}
qsort(pairs,sizeof(*pairs),pair_compare);
for(i = 0; i < 8; ++i)
{
printf("val: %d\tindex: %d\n",pairs[i].val,pairs[i].index);
}
free(pairs);
return 0;
}
,
建议代码有一个遍历8个结构的数组的外循环
对于每个包含8个结构的数组,请遍历该8个结构,根据每个结构的第一个字段中的值将索引放入该结构的数组中,并将其分成8个整数的单独数组。
然后是一个循环,循环遍历8个偏移量的数组,对指定的struct实例执行所需的操作。