Online Compiler C

#include <stdio.h> int main() { const int N = 10; int A [N],i,j,c; int half=N/2; for (i=0;i<N;i++) {scanf("%d",&A[i]); } for (i=0;i<half;i++){ for (j=0;j<half;j++){ if (A[j]>A[j+1]){ c=A[j]; A[j]=A[j+1]; A[j+1]=c; } } } for (i=half;i<N;i++){ for (j=half;j<N;j++){ if (A[j]<A[j+1]){ c=A[j]; A[j]=A[j+1]; A[j+1]=c; } } } for (i=0;i<N;i++){ printf("%d ",A[i]); } return 0;}
这段代码的功能是:读取10个整数,然后将数组的前半部分(前5个元素)按升序排序,后半部分(后5个元素)按降序排序,最后输出整个数组。

代码中存在一个边界错误。当 `j` 从 `half` 循环到 `N-1` 时,内层循环中访问了 `A[j+1]`,但 `j` 的最大值是 `N-1`,此时 `j+1` 等于 `N`,超出了数组的有效索引范围(0到N-1)。

- 检查内层循环的终止条件,确保 `j+1` 不会越界。对于长度为 `N` 的数组,有效索引是 `0` 到 `N-1`。
- 注意冒泡排序中,内层循环的边界通常需要比外层循环少一次比较,以避免访问不存在的元素。