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

C语言实现数组升序/降序判断函数运行逻辑错误求解

原代码问题分析

  • 单次比较就直接返回结果:只判断了第一对相邻元素就返回true,没有验证后续所有元素是否符合对应排序规则
  • 数组越界风险:循环条件写的是i < a->size,当i = a->size -1时,访问a->array[i+1]会超出数组合法下标范围
  • 逻辑缺失:没有明确记录数组整体的排序趋势,无法统一校验后续元素

解决思路

  1. 优先处理边界场景:数组长度为0或1时直接返回true
  2. 先确定数组的排序趋势:找到第一对不相等的相邻元素,判断整体是升序趋势还是降序趋势;如果所有元素都相等,直接返回true
  3. 遍历所有相邻元素对,校验是否全部符合预先确定的排序趋势,但凡有一对不符合就返回false
  4. 全部校验通过后返回true

修正后的代码

#include <stdbool.h>
#ifndef STRUCT_INTEGER_ARRAY
#define STRUCT_INTEGER_ARRAY
typedef struct s_integer_array
{
    int size;
    int* array;
} integer_array;
#endif

bool my_is_sort(integer_array* a)
{
    // 边界处理:空数组、单元素数组直接返回true
    if (a->size <= 1)
    {
        return true;
    }

    int trend = 0; // 1表示升序趋势,-1表示降序趋势,0表示还未确定趋势
    // 先确定整体排序趋势
    for (int i = 0; i < a->size - 1; i++)
    {
        if (a->array[i] < a->array[i+1])
        {
            trend = 1;
            break;
        }
        else if (a->array[i] > a->array[i+1])
        {
            trend = -1;
            break;
        }
    }

    // 所有元素都相等,直接返回true
    if (trend == 0)
    {
        return true;
    }

    // 遍历校验所有相邻元素是否符合趋势
    for (int i = 0; i < a->size -1; i++)
    {
        if (trend == 1)
        {
            // 升序要求前一个元素 <= 后一个,不符合就返回false
            if (a->array[i] > a->array[i+1])
            {
                return false;
            }
        }
        else
        {
            // 降序要求前一个元素 >= 后一个,不符合就返回false
            if (a->array[i] < a->array[i+1])
            {
                return false;
            }
        }
    }

    // 所有校验都通过
    return true;
}

测试用例验证

  • 输入[1,1,2]:趋势为升序,所有元素符合升序规则,返回true
  • 输入[2,1,-1]:趋势为降序,所有元素符合降序规则,返回true
  • 输入[4,7,0,3]:趋势为升序,第三对元素7>0不符合升序规则,返回false
  • 输入[]:边界场景,返回true
  • 输入[5,5,5]:所有元素相等,返回true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 11:45:03