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

#include <stdio.h> void sort_even_odd(int n, int a[]) { int i, j, x, t; for (i = 0; i < n - 1; i++) { x = -1; for (j = i ; j < n; j++) { if (a[j] % 2 == 0) { x = j; break;} } if (x != i&&x!=-1) { t = a[i]; a[i] = a[x]; a[x] = t; } } } int main() { return 0; }
这段代码定义了一个函数 `sort_even_odd`,它试图将数组中的偶数元素移动到数组的前面,奇数元素移动到后面。但目前的实现存在逻辑问题,不能正确完成排序。

- 外层循环 `i` 遍历数组,内层循环从当前位置 `i` 开始寻找第一个偶数。如果找到的偶数位置 `x` 不等于 `i`,就交换 `a[i]` 和 `a[x]`。但这样只交换一次,且内层循环每次从 `i` 开始,会导致已经排好的偶数位置被后续的奇数覆盖,或者偶数没有被正确集中到前面。

- 提示:思考一下,当 `a[i]` 本身已经是偶数时,是否需要交换?当前代码中,如果 `a[i]` 是偶数,内层循环找到的第一个偶数就是它自己(`x == i`),条件 `x != i` 不成立,所以不会交换,这没问题。但问题在于,如果 `a[i]` 是奇数,内层循环找到后面的第一个偶数后,交换后 `a[i]` 变成了偶数,但后续的 `i` 继续增加,这个偶数就被固定在了前面,而后面可能还有奇数没有被处理。实际上,你需要一种方法,让偶数不断向前“冒泡”,或者用两个指针分别从两端向中间移动。

- 另一个提示:可以尝试用两个索引,一个从左边找奇数,一个从右边找偶数,然后交换它们,这样能更高效地完成奇偶分离。