如何使用整数对整数对排序,同时仍将它们与C相关联?

时间:2015-11-16 05:10:43

标签: c++ c arrays sorting

我正在使用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的值大于失败值。 但是我如何对阵列进行核心化处理,以便在其他阵列中找到一个阵列中的一对?

2 个答案:

答案 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,您可以使用arrarr[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 }