C语言数组偶数升序前置、奇数降序后置的实现问题排查
代码问题排查与修正
存在的核心问题
- 奇偶判断逻辑不兼容负值:C语言中负奇数对2取模结果为-1,原判断
arr[i]%2==1会把所有负奇数判定为非奇数,导致奇数计数错误、拆分位置偏移。例如输入-3时,-3%2 == -1,不会被计入奇数总数。 - 排序逻辑完全偏离需求:原代码先对整个数组做全局升序排序,再拆分偶数、奇数。这种方式下拆分出的奇数本身就是升序排列,直接拼接后奇数段为升序,和要求的「奇数按降序排列」完全相反。
- 逻辑冗余:原代码将打印逻辑内嵌在排序函数中,虽然最后把临时数组值赋值回原数组,但前置排序逻辑错误,最终结果不符合预期。
修正实现思路
严格按需求拆分步骤执行:
- 遍历原数组,将所有偶数、奇数分别收集到两个独立临时数组,采用
x%2 !=0作为奇偶判定条件,兼容正负值场景 - 对偶数临时数组执行升序排序
- 对奇数临时数组执行降序排序
- 将排好序的偶数段、奇数段依次拷贝回原数组,主程序可直接访问重排后的结果
修正后可运行代码
#include <stdio.h> void special_sort(int arr[], int n); // 直接操作原数组,无需返回值 int main() { int i, n; printf("Enter how many elements:"); scanf("%d", &n); int arr[n]; printf("Enter %d elements:\n", n); for(i = 0; i < n; i++) { scanf("%d", &arr[i]); } special_sort(arr, n); // 主程序可直接访问重排后的数组,此处打印验证 printf("\nresults: "); for(i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } void special_sort(int arr[], int n) { int even[n], odd[n]; int even_cnt = 0, odd_cnt = 0, temp, i, j; // 拆分偶数、奇数到临时数组 for(i = 0; i < n; i++) { if(arr[i] % 2 == 0) { even[even_cnt++] = arr[i]; } else { odd[odd_cnt++] = arr[i]; } } // 偶数数组升序冒泡排序 for(i = 0; i < even_cnt - 1; i++) { for(j = 0; j < even_cnt - i - 1; j++) { if(even[j] > even[j+1]) { temp = even[j]; even[j] = even[j+1]; even[j+1] = temp; } } } // 奇数数组降序冒泡排序 for(i = 0; i < odd_cnt - 1; i++) { for(j = 0; j < odd_cnt - i - 1; j++) { if(odd[j] < odd[j+1]) // 降序逻辑:将更小的值向后交换 { temp = odd[j]; odd[j] = odd[j+1]; odd[j+1] = temp; } } } // 将排好序的两段拼回原数组 for(i = 0; i < even_cnt; i++) { arr[i] = even[i]; } for(i = 0; i < odd_cnt; i++) { arr[even_cnt + i] = odd[i]; } }
测试结果验证
- 输入1:
2 3 4 5 2 1 3
拆分偶数集合:2,4,2,升序排序后为2,2,4
拆分奇数集合:3,5,1,3,降序排序后为5,3,3,1
拼接最终结果:2 2 4 5 3 3 1,和示例输出完全匹配 - 输入2:
5 -3 4 2 -11 -4 6
拆分偶数集合:4,2,-4,6,升序排序后为-4,2,4,6
拆分奇数集合:5,-3,-11,降序排序后为5,-3,-11
拼接最终结果:-4 2 4 6 5 -3 -11(原示例输出遗漏偶数6,属于笔误,该结果为规则下的正确输出)
内容的提问来源于stack exchange,提问作者Kaizuke
相关产品推荐
相关产品推荐

