【问题标题】:Sort an array so that evens appear first in descending order then odds in ascending order [duplicate]对数组进行排序,以使偶数首先按降序出现,然后赔率按升序出现[重复]
【发布时间】:2018-03-16 04:29:48
【问题描述】:

我正在尝试对整数数组进行排序,以便先按降序打印偶数,然后按升序打印数组中的奇数。

So the output would look like: 
8 6 4 2 1 3 5 7 9

我该怎么做呢?

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

int compare(const void *p, const void *q);
void printArr(int arr[], int n);

//Driver program to test sort
int main()
{
    int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    int size = sizeof(nums) / sizeof(nums[0]);
    qsort((void*) nums, size, sizeof(nums[0]), compare);

    printf("Sorted array is\n");
    printArr(nums, size);

    return 0;
}

//This function is used in qsort to decide the relative order of elements at addresses p and q
int compare(const void *p, const void *q)
{
    return ( *(int*)p < *(int*)q);

}
//A utility function to print an array
void printArr(int arr[], int n)
{
    int i;
    for (i = 0; i < n; ++i)
        printf("%d ", arr[i]);
}

【问题讨论】:

  • 都是比较功能。提示:偶数总是小于奇数。
  • OP 的 compare() 不适用于 qsort()qsort() 需要 -+ 或 0 结果,而不是 0,1。
  • 您还可以做一件事,将初始数组分成两个临时数组,一个用于排序的偶数,另一个用于排序的奇数。然后将这两个数组合并为一个并以您想要的方式打印它们。
  • 您可以搜索以前的问题,可能使用“[c] sort ascending descending odd even”作为搜索词。重复的奇数和偶数排序略有不同,但基本思想完全相同——以不同的方式处理奇数和偶数值,并将一组排在另一组之前,并且可能在不同的方向上排序。一旦你有了基本的想法,这一切都很简单,下面的答案也很好地概述了。
  • @JonathanLeffler,你的副本是 C++(和一个非常尴尬的 C 答案)授予的主体是相同的,但实现不同。

标签: c


【解决方案1】:

因为您的比较函数与 qsort 正在寻找的不匹配。规则如下(假设第一个输入是p,第二个输入是q):

  • -1 表示 p 应该在 q 之前
  • 0 表示他们是平等的
  • 1 表示 q 应该在 p 之前

话虽如此,让您完成这项工作的关键是更改比较函数以以不同方式处理偶数/奇数。更具体地说,您需要检查第一个是偶数,第二个是奇数,第一个是奇数,第二个是偶数,都是偶数还是都是奇数,并采取相应的行动。

这是设置(请记住,模数很昂贵,所以这不是最有效的):

int first = *(int *)p;
int second = *(int *)q;
int firstIsOdd = first % 2; // Returns 1 if odd, 0 if even
int secondIsOdd = second % 2;

既然您知道哪一个是偶数,哪一个是奇数,您就可以以不同的方式处理每种情况。规则如下:

  1. 第一个是奇数,第二个是偶数?返回1,以便列表中的第二个排在第一个之前。
  2. 第一个是偶数,第二个是奇数?返回 -1 以便列表中的第一个排在第二个之前。
  3. 两个奇数?正常比较它们以实现升序(即,如果相等则返回0,如果第一个小于第二个,则返回-1,如果第二个小于第一个,则返回1
  4. 两者都甚至?比较它们,但与通常执行的降序操作相反(即,如果相等则返回0,如果第二个小于第一个,则返回-1,如果第一个小于第二个,则返回1

【讨论】:

    【解决方案2】:

    在 compare 函数中,测试 p 和 q 是否为偶数。偶数和奇数有四种可能的组合 {ee, eo, oe, oo}。例如,如果它们都是偶数,则以一种方式比较它们,例如返回 p&gt;q ((int*)p &lt; *(int*)q) 你有加号,在这种情况下, false 需要为负数。如果 p 为偶数,则 p 较小,如果 p 为奇数且 q 为偶数,则 p 较大。如果它们都是奇怪的,则以另一种方式比较它们,例如p&lt;q.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多