【问题标题】:Sort 2 arrays in C by a joint logic按联合逻辑对 C 中的 2 个数组进行排序
【发布时间】:2020-02-14 11:14:58
【问题描述】:

给定两个数组

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

我想在“逻辑”涉及两个数组的“单程”中对它们进行排序,意思是:
如果

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 suma+b=[5,6,4,13,6,8]

【问题讨论】:

  • @TanveerBadar 不同意此处使用“任何代码”这一短语。我认为我们应该在澄清时对 OP 有礼貌。
  • OP,请在您调用sortBySum() 的位置添加代码以及您如何处理这些返回值1-1
  • @DsCpp 最简单的方法是编写自己的排序函数,例如使用冒泡排序方法。在这种情况下,无需创建额外的数组。
  • 使用任何排序算法并使其适应您对两个数组的使用和您的比较函数。如果足以对索引数组进行排序而不是对两个数据数组进行排序,或者将两个数组替换为结构数组 struct { int a; int b } array[] = { {1, 4}, {3, 3}, {2, 2}, ... };,则可以使用 qsort 库函数

标签: c arrays sorting


【解决方案1】:

当任务涉及排序时,qsort 在大多数情况下是您的朋友。

但是qsort 只能对一个数组进行排序。因此,您需要将数组ab 中的元素复制到包含来自ab 的数据的结构数组中。然后使用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

【讨论】:

  • 这是正确的方法。然而,一个挑剔的是,((pa-&gt;a + pa-&gt;b) - (pb-&gt;a + pb-&gt;b)) 可能会下溢。
【解决方案2】:

原始方法可能如下所示。

#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 

使用冒泡排序方法对数组进行排序的代码可以移动到单独的函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 2017-07-28
    • 2019-04-30
    • 2015-03-16
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多