You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将整数数组排序为偶数降序在前、奇数升序在后?

实现偶数降序+奇数升序的数组排序

我来帮你搞定这个特殊的排序需求!你的目标是让数组里的偶数先按降序排列,紧接着奇数按升序排列,比如输入{1,2,3,4,5,6,7,8,9}要输出8 6 4 2 1 3 5 7 9对吧?咱们来修改你现有的代码,核心是重写qsort的比较函数。

原代码的问题

你当前的compare函数只是做了简单的升序比较:return *(int*)p < *(int*)q;,这只能实现整体升序,没法区分奇偶并应用不同的排序规则,所以需要重新设计比较逻辑。

修改后的完整代码

#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;
}

// 重写qsort的比较函数,实现偶数降序+奇数升序
int compare(const void *p, const void *q)
{
    int num1 = *(int*)p;
    int num2 = *(int*)q;
    // 判断两个数的奇偶性
    int isEven1 = (num1 % 2 == 0);
    int isEven2 = (num2 % 2 == 0);

    // 情况1:都是偶数,按降序排列
    if (isEven1 && isEven2) {
        return num2 - num1; // 大的偶数排前面,比如8和6,6-8=-2,qsort会把8放前面
    }
    // 情况2:都是奇数,按升序排列
    else if (!isEven1 && !isEven2) {
        return num1 - num2; // 小的奇数排前面,比如1和3,1-3=-2,qsort把1放前面
    }
    // 情况3:一个偶数一个奇数,偶数排前面
    else {
        return isEven1 ? -1 : 1; // 如果num1是偶数,返回-1让它排前面;反之返回1让num2(偶数)排前面
    }
}

// 打印数组的工具函数
void printArr(int arr[], int n)
{
    int i;
    for (i = 0; i < n; ++i)
        printf("%d ", arr[i]);
}

逻辑解释

咱们拆解一下compare函数的核心逻辑:

  1. 奇偶判断:先通过num % 2 == 0判断每个数是不是偶数
  2. 同偶处理:两个都是偶数时,用num2 - num1来实现降序——qsort的规则是:返回值为负时,p对应的元素排在q前面;返回正的话则相反。所以大的偶数会被放到前面。
  3. 同奇处理:两个都是奇数时,用num1 - num2实现升序,小的奇数会被放到前面。
  4. 奇偶混合:如果一个是偶数一个是奇数,直接让偶数排在奇数前面——如果p是偶数就返回-1,否则返回1。

运行这段代码,输入你给的测试数组,就能得到你想要的输出:8 6 4 2 1 3 5 7 9啦!

内容的提问来源于stack exchange,提问作者R. Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:13:53