C语言实现判断一维数组排序状态的函数及代码错误排查
代码问题排查
- 变量未初始化:
tempcr、tempdcr两个计数变量定义时没有赋值初始值0,会存储内存中的随机垃圾值,导致计数结果完全不符合预期。 - 变量名大小写不匹配:函数形参是小写的
n,但循环判断条件、计数比较时用的是大写的N,C语言大小写敏感,该错误会导致无法正确读取数组长度,甚至编译报错。 - 相等元素的判断逻辑有漏洞:原代码用
if...else if分支判断相邻元素关系,当相邻两个元素相等时,A[i]<=A[i+1]和A[i]>=A[i+1]同时成立,此时只会进入第一个if分支给tempcr计数,tempdcr不会计数,这种情况下哪怕数组元素完全相等,也无法判定为降序。
修正后的实现代码
int Is_Sorted(int* A, int n){ // 边界处理:空数组或只有1个元素的数组默认视为已排序,返回值可根据需求调整 if (n <= 1) return 1; int tempcr = 0, tempdcr = 0; for (int i=0; i < n-1; i++){ // 拆分两个独立if,相等场景同时给两个计数器累加 if (A[i] <= A[i+1]){ tempcr++; } if (A[i] >= A[i+1]){ tempdcr++; } } if(tempcr == n-1){ return 1; }else if(tempdcr == n-1){ return -1; }else{ return 0; } }
优化实现思路
可以不用两个累加计数器,用标志位实现提前终止,减少不必要的遍历:
int Is_Sorted(int* A, int n) { if (n <= 1) return 1; int is_asc = 1, is_desc = 1; for (int i = 0; i < n-1; i++) { if (A[i] > A[i+1]) is_asc = 0; if (A[i] < A[i+1]) is_desc = 0; // 提前退出:已经确定既不是升序也不是降序,无需继续遍历 if (!is_asc && !is_desc) break; } if (is_asc) return 1; if (is_desc) return -1; return 0; }
内容的提问来源于stack exchange,提问作者Pung
相关产品推荐
相关产品推荐

