在线编译器 C

#include <stdio.h> enum {size=10}; int main(){ int a[size]; for(int i=0;i<size;i++){ scanf("%d",&a[i]); }int flag=0; while(!flag){ flag=1; for(int i=0;i<size;i++){ int temp=a[i]; if(a[i]%10>a[i+1]%10){ a[i]=a[i+1]; a[i+1]=temp; flag=0; } } }for(int i=0;i<size;i++){ printf("%d",a[i]); } return 0; }
这段代码试图实现一个冒泡排序,但排序的依据是每个数字的个位数(即 `%10` 的结果)。代码中存在一个数组越界访问的错误。

- 在 `for(int i=0;i<size;i++)` 循环中,当 `i` 等于 `size-1` 时,`a[i+1]` 访问了 `a[10]`,这超出了数组 `a` 的索引范围(有效索引是 0 到 9)。这会导致未定义行为,可能造成程序崩溃或错误结果。

- 另外,冒泡排序的内层循环通常应该每次减少比较范围,因为每一轮都会把当前未排序部分的最大值“冒泡”到最后。你的代码中内层循环每次都遍历整个数组,虽然逻辑上仍然可以工作,但效率较低,并且由于越界问题,排序结果可能不正确。