You need to enable JavaScript to run this app. C语言数组偶数升序前置、奇数降序后置的实现问题排查
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组偶数升序前置、奇数降序后置的实现问题排查

代码问题排查与修正

存在的核心问题

  • 奇偶判断逻辑不兼容负值:C语言中负奇数对2取模结果为-1,原判断arr[i]%2==1会把所有负奇数判定为非奇数,导致奇数计数错误、拆分位置偏移。例如输入-3时,-3%2 == -1,不会被计入奇数总数。
  • 排序逻辑完全偏离需求:原代码先对整个数组做全局升序排序,再拆分偶数、奇数。这种方式下拆分出的奇数本身就是升序排列,直接拼接后奇数段为升序,和要求的「奇数按降序排列」完全相反。
  • 逻辑冗余:原代码将打印逻辑内嵌在排序函数中,虽然最后把临时数组值赋值回原数组,但前置排序逻辑错误,最终结果不符合预期。

修正实现思路

严格按需求拆分步骤执行:

  1. 遍历原数组,将所有偶数、奇数分别收集到两个独立临时数组,采用x%2 !=0作为奇偶判定条件,兼容正负值场景
  2. 对偶数临时数组执行升序排序
  3. 对奇数临时数组执行降序排序
  4. 将排好序的偶数段、奇数段依次拷贝回原数组,主程序可直接访问重排后的结果

修正后可运行代码

#include <stdio.h>

void special_sort(int arr[], int n); // 直接操作原数组,无需返回值

int main()
{
    int i, n;
    printf("Enter how many elements:");
    scanf("%d", &n);
    int arr[n];
    printf("Enter %d elements:\n", n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    special_sort(arr, n);
    // 主程序可直接访问重排后的数组,此处打印验证
    printf("\nresults: ");
    for(i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

void special_sort(int arr[], int n)
{
    int even[n], odd[n];
    int even_cnt = 0, odd_cnt = 0, temp, i, j;
    // 拆分偶数、奇数到临时数组
    for(i = 0; i < n; i++)
    {
        if(arr[i] % 2 == 0)
        {
            even[even_cnt++] = arr[i];
        }
        else
        {
            odd[odd_cnt++] = arr[i];
        }
    }
    // 偶数数组升序冒泡排序
    for(i = 0; i < even_cnt - 1; i++)
    {
        for(j = 0; j < even_cnt - i - 1; j++)
        {
            if(even[j] > even[j+1])
            {
                temp = even[j];
                even[j] = even[j+1];
                even[j+1] = temp;
            }
        }
    }
    // 奇数数组降序冒泡排序
    for(i = 0; i < odd_cnt - 1; i++)
    {
        for(j = 0; j < odd_cnt - i - 1; j++)
        {
            if(odd[j] < odd[j+1]) // 降序逻辑:将更小的值向后交换
            {
                temp = odd[j];
                odd[j] = odd[j+1];
                odd[j+1] = temp;
            }
        }
    }
    // 将排好序的两段拼回原数组
    for(i = 0; i < even_cnt; i++)
    {
        arr[i] = even[i];
    }
    for(i = 0; i < odd_cnt; i++)
    {
        arr[even_cnt + i] = odd[i];
    }
}

测试结果验证

  • 输入1:2 3 4 5 2 1 3
    拆分偶数集合:2,4,2,升序排序后为2,2,4
    拆分奇数集合:3,5,1,3,降序排序后为5,3,3,1
    拼接最终结果:2 2 4 5 3 3 1,和示例输出完全匹配
  • 输入2:5 -3 4 2 -11 -4 6
    拆分偶数集合:4,2,-4,6,升序排序后为-4,2,4,6
    拆分奇数集合:5,-3,-11,降序排序后为5,-3,-11
    拼接最终结果:-4 2 4 6 5 -3 -11(原示例输出遗漏偶数6,属于笔误,该结果为规则下的正确输出)

内容的提问来源于stack exchange,提问作者Kaizuke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 18:06:05