C语言实现奇偶分离与排序算法详解

星野
星野
发布时间:2026-10-14 | 3人浏览过
原创

在处理包含多个整数的数据时,有时需要特定的排序规则,例如“先奇后偶”且各自内部升序排列。本内容基于C语言标准库,提供了一种不依赖复杂数据结构,仅使用基础数组和简单比较逻辑来实现该需求的方案。核心思路是将输入数据分离到两个独立数组中,分别进行排序后再依次打印。

目标与逻辑分析

假设有一组整数,要求最终输出顺序满足以下条件:

  1. 奇数优先:所有奇数排在前面。
  2. 偶数随后:所有偶数排在后面。
  3. 局部升序:奇数部分内部从小到大排列,偶数部分内部也从小到大排列。

为了实现这一目标,最直接的方法是采用“分类-排序-合并”的策略:

  • 分类:遍历原始数组,根据奇偶性将数字放入不同的缓冲区数组。
  • 排序:对每个缓冲区内的有效数据进行升序排序(如冒泡排序)。
  • 输出:先打印排序后的奇数数组,再打印排序后的偶数数组。

关键步骤与代码实现

第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语言基础算法的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表