在线编译器 C

#include <stdio.h> void sort_even_odd(int n, int a[]) { int i, j, temp; for (i = 0; i < n; i++) { for (j = 0; j < n - 1 - i; j++) { if (a[j] % 2 != 0) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } int main() { int a[5] = {1, 23, 5, 8, 6}; // 1 5 8 6 23// sort_even_odd(5, a); return 0; }
这段代码试图将数组中的奇数移动到数组末尾,偶数移动到数组开头。它使用了冒泡排序的思路,但只根据奇偶性进行交换。

代码的主要问题是排序逻辑不完整。当前只检查 `a[j]` 是否为奇数,如果奇数就向后交换,但这样无法正确处理所有情况。例如,当遇到偶数时,它不会与前面的奇数交换,导致奇数可能无法完全移动到后面。

- 提示1:考虑当 `a[j]` 是偶数但 `a[j+1]` 是奇数时,是否需要交换?当前代码只处理了 `a[j]` 为奇数的情况,缺少对另一种情况的处理。
- 提示2:思考一下,如果只根据奇偶性排序,应该让所有偶数在前、奇数在后,那么比较两个相邻元素时,什么情况下需要交换才能达到这个目标?