我正在使用C
,但我也对C++
持开放态度。
我有一组整数对形式的数据,如{1,1} {600,2} {10,4}等。
让我们称他们为{a,b}。我使用像arr[N][2]
这样的数组来存储数据。
数组已按b
排序。我需要检查ai
上的条件并找到满足条件的第一个ai
。
一种简单的方法是从i = 0开始直线检查i = N.但是这并没有利用这样的事实:如果条件因{10}的特定值而失败,那么只有可能通过测试的值是大于a
的值,大于a
。 10。
也许我应该有一个按a
排序的数组副本,这样当一个condn失败某个值a
时,我可以检查a
的值大于失败值。
但是我如何对阵列进行核心化处理,以便在其他阵列中找到一个阵列中的一对?
答案 0 :(得分:1)
创建另一个包含第一个数组的索引的数组/向量。
std::vector indices(size);
for ( size_t i = 0; i < size; ++i )
indices[i] = i;
然后对indices
进行排序,以便:
arr[indices[i]][0] <= arr[indices[i+1]][0]
之后,给定索引i
,您可以使用arr
在arr[indices[i]]
中找到该元素。
答案 1 :(得分:0)
虽然你已经有了C ++的答案,但继续评论,为了完整起见,使用指针数组的类似C解决方案可能类似于以下内容:
#include <stdio.h>
#include <stdlib.h>
/* qsort compare function for pointer array */
int cmp_pairs (const void *a, const void *b)
{
int *aa = *(int **)a;
int *ab = *(int **)b;
if (*aa < *ab)
return -1;
return (*ab < *aa);
}
int main (void) {
/* original pairs array in b-sort order */
int pairs[][2] = {{ 12, 1 },
{ 37, 2 },
{ 41, 3 },
{ 82, 4 },
{ 29, 5 },
{ 63, 6 },
{ 78, 7 },
{ 84, 8 },
{ 67, 9 },
{ 77, 10 }};
size_t n = sizeof pairs/sizeof *pairs;
size_t i = 0;
int *pairs_a[n]; /* array of pointers for a-sort */
/* fill pairs_a pointer array */
for (i = 0; i < n; i++)
pairs_a[i] = pairs[i];
/* sort pointer array based on a */
qsort (pairs_a, n, sizeof *pairs_a, cmp_pairs);
/* output both arrays */
printf ("\n original array in b-sort order:\n\n");
for (i = 0; i < n; i++)
printf (" { %3d, %3d }\n", pairs[i][0], pairs[i][1]);
printf ("\n pointer array in a-sort order:\n\n");
for (i = 0; i < n; i++)
printf (" { %3d, %3d }\n", pairs_a[i][0], pairs_a[i][1]);
putchar ('\n');
return 0;
}
a-Sorted Output Maintaing Relationship
$ ./bin/pairs_ab
original array in b-sort order:
{ 12, 1 }
{ 37, 2 }
{ 41, 3 }
{ 82, 4 }
{ 29, 5 }
{ 63, 6 }
{ 78, 7 }
{ 84, 8 }
{ 67, 9 }
{ 77, 10 }
pointer array in a-sort order:
{ 12, 1 }
{ 29, 5 }
{ 37, 2 }
{ 41, 3 }
{ 63, 6 }
{ 67, 9 }
{ 77, 10 }
{ 78, 7 }
{ 82, 4 }
{ 84, 8 }