Онлайн компилятор C

#include <stdio.h> int main() { int a[10]; for (int j = 0; j < 10; j++) { scanf("%d", &a[j]); } for (int i = 0; i < 10; i++) { int mini = i; for (int j = i + 1; j < 10; j++) { if (a[j]%10 < a[mini]%10) { mini = i; } } int tmp = a[i]; a[i] = a[mini]; a[mini] = tmp; } for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }
这段代码试图实现选择排序,但排序依据是每个数字的个位数(通过 `%10` 得到)。代码读取10个整数,然后按个位数从小到大排序并输出。

代码中存在一个逻辑错误,导致排序结果不正确。

- 在内层循环中,当发现更小的个位数时,你把 `mini` 更新为 `i`,但应该更新为 `j`。`mini` 应该记录当前找到的最小个位数元素的下标,而不是始终指向外层循环的当前元素。
- 每次内层循环结束后,你都会执行交换,即使 `mini` 仍然等于 `i`(即没有找到更小的元素),这会导致不必要的交换,但不会破坏结果。主要问题是 `mini` 的赋值错误。