Сортировать 2 массива в C по общей логике - PullRequest
0 голосов
/ 14 февраля 2020

Учитывая два массива

a = [1,3,2,8,5,6]
b = [4,3,2,5,1,2]

Я хотел бы отсортировать их в «один проход», где «logi c» включает в себя два массива, что означает:
, если

int sortBySum(index i, index j){
    if (a[i]+b[i] > a[j]+b[j]){
        return 1;
    }
    return -1;
}

Выход двух массивов будет

a = [2,1,3,5,6,8]
b = [2,4,3,1,2,5]

Поскольку исходный arrays sum равен a+b=[5,6,4,13,6,8]

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Когда задача касается сортировки, qsort - в большинстве случаев - ваш друг.

Но qsort может сортировать только один массив. Поэтому вам нужно скопировать элементы из массива a и b в массив структур, содержащих данные из a и b. Затем используйте qsort и затем скопируйте данные обратно.

Как:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
  int a;
  int b;
} common_data;

// Compare function for qsort
int cmp(const void *p1, const void *p2)
{
  common_data* pa = (common_data*)p1;
  common_data* pb = (common_data*)p2;
  return ((pa->a + pa->b) - (pb->a + pb->b));
}

int main(void)
{
  int a[] = {1,3,2,8,5,6};
  int b[] = {4,3,2,5,1,2};
  size_t sz = sizeof(a)/sizeof(a[0]);
  common_data carr[sz];

  // Copy to common array
  for (size_t i = 0; i < sz; ++i)
  {
    carr[i].a = a[i];
    carr[i].b = b[i];
  }

  // Sort common array
  qsort(carr, sz, sizeof(carr[0]), cmp);

  // Copy to back to original array
  for (size_t i = 0; i < sz; ++i)
  {
    a[i] = carr[i].a;
    b[i] = carr[i].b;
  }

  // Print array a
  for (size_t i = 0; i < sz; ++i)
  {
    printf("%d ", a[i]);
  }
  printf("\n");

  // Print array b
  for (size_t i = 0; i < sz; ++i)
  {
    printf("%d ", b[i]);
  }
  printf("\n");

  return 0;
}

Вывод:

2 1 3 5 6 8
2 4 3 1 2 5
1 голос
/ 14 февраля 2020

Примитивный подход может выглядеть следующим образом.

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
    int a[] = { 1, 3, 2, 8, 5, 6 };
    int b[] = { 4, 3, 2, 5, 1, 2 };

    const size_t N = sizeof( a ) / sizeof( *a );

    printf( "a: " );
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    printf( "b: " );
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", b[i] );
    }
    putchar( '\n' );

    putchar( '\n' );

    for ( size_t n = N, last; !( n < 2 ); n = last )
    {
        for ( size_t i = last = 1; i < n; i++ )
        {
            if ( a[i] + b[i] < a[i-1] + b[i-1] )
            {
                int tmp = a[i];
                a[i]    = a[i-1];
                a[i-1]  = tmp;

                tmp     = b[i];
                b[i]    = b[i-1];
                b[i-1]  = tmp;

                last = i;
            }
        }
    }

    printf( "a: " );
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    printf( "b: " );
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", b[i] );
    }
    putchar( '\n' );

    putchar( '\n' );

    return 0;
}

Вывод программы:

a: 1 3 2 8 5 6 
b: 4 3 2 5 1 2 

a: 2 1 3 5 6 8 
b: 2 4 3 1 2 5 

Код, который сортирует массивы с помощью метода пузырьковой сортировки, может быть перемещен в отдельная функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...