C语言实现数组升序/降序判断函数运行逻辑错误求解
原代码问题分析
- 单次比较就直接返回结果:只判断了第一对相邻元素就返回true,没有验证后续所有元素是否符合对应排序规则
- 数组越界风险:循环条件写的是
i < a->size,当i = a->size -1时,访问a->array[i+1]会超出数组合法下标范围 - 逻辑缺失:没有明确记录数组整体的排序趋势,无法统一校验后续元素
解决思路
- 优先处理边界场景:数组长度为0或1时直接返回true
- 先确定数组的排序趋势:找到第一对不相等的相邻元素,判断整体是升序趋势还是降序趋势;如果所有元素都相等,直接返回true
- 遍历所有相邻元素对,校验是否全部符合预先确定的排序趋势,但凡有一对不符合就返回false
- 全部校验通过后返回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
相关产品推荐
相关产品推荐

