在线编译器 C

#include <stdio.h> enum {size=10}; int main(){ int a[size]; for(int i=0;i<size;i++){ scanf("%d",&a[i]); }for(int i=0;i<size-1;i++){ int num_min=i; for(int j=i+1;j<size;j++){ if(a[num_min]%10>a[j]%10){ num_min=j; } if(num_min!=i){ int temp=a[num_min]; a[num_min]=a[i]; a[i]=temp; } } }for(int i=0;i<10;i++){ printf("%d ",a[i]); } return 0; }
这段代码的功能是:读入10个整数,然后根据每个数的个位数(即除以10的余数)进行选择排序,最后输出排序后的数组。

代码中存在一个逻辑错误。在内部循环中,交换操作被放在了判断条件内部,并且每次发现更小的个位数时都会立即交换,而不是在找到最小元素后再交换。这会导致排序结果不正确。

- 选择排序的正确思路是:先遍历未排序部分找到最小元素的下标,然后在内部循环结束后再进行一次交换。你的代码在每次比较后都尝试交换,这破坏了选择排序的逻辑。
- 另外,交换的条件 `if(num_min!=i)` 应该放在内部循环结束之后,而不是放在内部循环的每次迭代中。