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

#include <stdio.h> void sort_even_odd(int n, int a[]) { int x = 0; for (int i = 0; i < n; i++) { if (a[i] % 2 == 0) { x++; } } int sort = 0; while (!sort) { sort = 1; for (int i = 0; i < n-1; i++) { if (a[i] % 2 != 0 && a[i + 1] % 2 == 0) { int temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; sort = 0; } } } for (int i = 0; i < x - 1; i++) { int maxi = i; for (int j = i + 1; j < x; j++) { if (a[maxi] < a[j]) { maxi = j; } } if (maxi != i) { int c = a[i]; a[i] = a[maxi]; a[maxi] = c; } } for (int i = x; i < n - 1; i++) { int maxi = i; for (int j = i + 1; j < n; j++) { if (a[maxi] < a[j]) { maxi = j; } } if (maxi != i) { int c = a[i]; a[i] = a[maxi]; a[maxi] = c; } } } int main() { int a[6] = {5, 1, 0, 1, 0, 1}; sort_even_odd(6, a); for (int i = 0; i < 6; i++) { printf("%d ", a[i]); } return 0; }
这段代码实现了一个排序函数 `sort_even_odd`,它的目标是将数组中的偶数全部移到前面,奇数全部移到后面,然后分别对偶数部分和奇数部分进行降序排序。

代码首先统计偶数的个数 `x`,然后通过冒泡式的交换将奇数往后移、偶数往前移,最后分别对前 `x` 个元素(偶数)和后 `n-x` 个元素(奇数)进行选择排序(降序)。

你的代码存在一个逻辑问题:在移动偶数到前面的过程中,你只交换了奇数和相邻偶数,但这样并不能保证所有偶数都排到所有奇数前面,因为一次遍历可能不够。虽然你用了 `while` 循环反复交换直到没有交换发生,但这种方法效率较低且容易出错。

- 提示1:检查 `while` 循环中的交换条件。当遇到一个奇数后面跟着偶数时,你交换它们,但交换后原来的偶数到了前面,原来的奇数到了后面。然而,这个奇数可能前面还有偶数吗?你的循环是从左到右扫描的,一次交换后,原来的奇数被移到了右边,但左边可能还有偶数没有被处理到。考虑一下,如果数组是 `[1, 2, 3, 4]`,第一次扫描会交换 `1` 和 `2` 得到 `[2, 1, 3, 4]`,然后继续扫描,`1` 和 `3` 不交换,`3` 和 `4` 交换得到 `[2, 1, 4, 3]`。此时 `1` 仍然在 `4` 前面,但 `1` 是奇数,`4` 是偶数,顺序不对。你的 `while` 循环会再次扫描,但第二次扫描时,`2` 和 `1` 不交换(因为 `2` 是偶数,`1` 是奇数,条件不成立),`1` 和 `4` 交换得到 `[2, 4, 1, 3]`,然后 `1` 和 `3` 不交换。最终结果 `[2, 4, 1, 3]` 中,偶数 `2` 和 `4` 在前面,奇数 `1` 和 `3` 在后面,看起来正确。但考虑更