C语言实现奇偶分离与排序算法详解
在处理包含多个整数的数据时,有时需要特定的排序规则,例如“先奇后偶”且各自内部升序排列。本内容基于C语言标准库,提供了一种不依赖复杂数据结构,仅使用基础数组和简单比较逻辑来实现该需求的方案。核心思路是将输入数据分离到两个独立数组中,分别进行排序后再依次打印。
目标与逻辑分析
假设有一组整数,要求最终输出顺序满足以下条件:
- 奇数优先:所有奇数排在前面。
- 偶数随后:所有偶数排在后面。
- 局部升序:奇数部分内部从小到大排列,偶数部分内部也从小到大排列。
为了实现这一目标,最直接的方法是采用“分类-排序-合并”的策略:
- 分类:遍历原始数组,根据奇偶性将数字放入不同的缓冲区数组。
- 排序:对每个缓冲区内的有效数据进行升序排序(如冒泡排序)。
- 输出:先打印排序后的奇数数组,再打印排序后的偶数数组。
关键步骤与代码实现
第1步:定义基础配置与工具宏
首先定义数组大小常量以及用于类型简化或逻辑判断的宏,保持代码简洁。
#include <stdio.h>
#define COUNT 10
// 简化布尔类型逻辑
#define bool int
#define true 1
#define false 0
第2步:实现通用升序排序函数
编写一个通用的冒泡排序函数 sortFunction,它接收整型数组指针作为参数。虽然原逻辑中固定了大小,但为了复用性,这里展示基础的交换排序逻辑:
int* sortFunction(int data[]) {
int i, j;
// 冒泡排序外层循环控制比较轮数
for(j = 0; j < COUNT - 1; j++) {
// 内层循环进行相邻元素比较
for(i = 0; i < COUNT - 1 - j; i++) {
if (data[i] > data[i+1]) {
int tmp = data[i];
data[i] = data[i+1];
data[i+1] = tmp;
}
}
}
return data;
}
第3步:实现奇偶性判断函数
定义 isOddNumber 函数,通过取模运算 % 2 判断是否为奇数。注意:data % 2 == 0 表示偶数,否则为奇数。
bool isOddNumber(int data) {
if(data % 2 == 0) {
return false; // 偶数
} else {
return true; // 奇数
}
}
第4步:主逻辑——分离与处理
在 main 函数中初始化测试数据,并创建两个容量足够大的数组 oddArr 和 evenArr 来分别暂存奇数和偶数。
重要提示:由于初始化时数组元素为0,而输入数据可能不包含某些值,后续遍历时需跳过未赋值的占位符(即值为0且非实际输入0的情况,但在本题特定上下文中,通常假设输入无重复干扰或专门处理非零值)。更严谨的做法是记录有效元素个数,但此处沿用原逻辑,通过判断 num != 0 过滤空白填充。
int main() {
// 初始化测试数据
int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int oddArr[COUNT] = {0};
int evenArr[COUNT] = {0};
int *tmp = NULL;
int i, m = 0, n = 0; // m记录偶数索引,n记录奇数索引
// 1. 遍历原始数组,按奇偶性分离到不同数组
for(i = 0; i < COUNT; i++) {
if(isOddNumber(arr[i])) {
oddArr[n++] = arr[i]; // 存入奇数数组
} else {
evenArr[m++] = arr[i]; // 存入偶数数组
}
}
// 2. 对奇数数组进行排序
tmp = sortFunction(oddArr);
puts("\n========odd number==========\n");
for(i = 0; i < COUNT; i++) {
int num = *tmp;
// 跳过未初始化的0值填充
if(num != 0) {
printf("%d ", num);
}
tmp++;
}
// 3. 对偶数数组进行排序
tmp = sortFunction(evenArr);
puts("\n========even number==========\n");
for(i = 0; i < COUNT; i++) {
int num = *tmp;
if(num != 0) {
printf("%d ", num);
}
tmp++;
}
printf("over");
return 0;
}
注意事项与排错
关于零值处理的局限性:
上述代码中使用 if(num != 0) 来过滤未使用的数组位置。这意味着如果用户输入的原始数据中本身包含数字 0,该代码会将这个有效的 0 误判为空值并忽略输出。在实际生产环境中,建议使用计数器变量(如 n_count 和 m_count)记录真实的有效数据长度,并在打印时使用这些长度限制循环次数,从而避免此Bug。
简要总结
通过分离存储和二次排序的方式,可以灵活地实现自定义规则的数组排序。这种方法虽然空间复杂度略高(需要额外数组),但逻辑清晰,易于理解和维护。对于小规模数据量,这是非常有效的解决方案。以上就是C语言实现奇偶排序算法的详细内容,更多关于C语言基础算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













