首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言實現奇偶排序:奇數升序在前、偶數升序在後

     編輯:關於C

題目要求

輸入 10 個整數,輸出排序後的序列:奇數在前、偶數在後,各自升序排列。例如輸入 10 9 8 7 6 5 4 3 2 1,輸出奇數部分 1 3 5 7 9,偶數部分 2 4 6 8 10。

算法設計

  1. 分離:遍歷原數組,將奇數存入 oddArr,偶數存入 evenArr,記錄各自長度 m、n。
  2. 排序:對兩個子數組分別調用冒泡排序 sortFunction(升序)。
  3. 輸出:順序打印非零元素(初始化為 0 作為哨兵)。

完整代碼

#include \
#define COUNT 10\
#define bool int\
#define true 1\
#define false 0\

int* sortFunction(int data[]) {\
    for (int j = 0; j < COUNT - 1; ++j) {\
        for (int 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;\
}\

bool isOddNumber(int data) {\
    return (data % 2 != 0);\
}\

int main() {\
    int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};\
    int oddArr[COUNT] = {0}, evenArr[COUNT] = {0};\
    int m = 0, n = 0;\
\
    for (int i = 0; i < COUNT; ++i) {\
        if (isOddNumber(arr[i])) oddArr[m++] = arr[i];\
        else evenArr[n++] = arr[i];\
    }\
\
    int *tmp = sortFunction(oddArr);\
    puts("\\n========odd number==========\\n");\
    for (int i = 0; i < COUNT; ++i) {\
        int num = *tmp++;\
        if (num != 0) printf("%d ", num);\
    }\
\
    tmp = sortFunction(evenArr);\
    puts("\\n========even number==========\\n");\
    for (int i = 0; i < COUNT; ++i) {\
        int num = *tmp++;\
        if (num != 0) printf("%d ", num);\
    }\
    printf("\\nover");\
    return 0;\
}

運行結果

========odd number==========\
1 3 5 7 9 \
========even number==========\
2 4 6 8 10 \
over

代碼優化建議

  1. 傳遞有效長度:sortFunction(int data[], int len) 避免排序哨兵 0,支援任意長度。
  2. 使用標準庫:qsort + 比較函數,更高效且穩定。
  3. 原地分區:借鑒快排 partition 思想,一次掃描完成奇偶分離,無需額外數組。
  4. 移除自定義 bool:C99 起包含 ,直接用 bool/true/false。

優化版核心片段

#include \
#include \

int cmp_asc(const void *a, const void *b) {\
    return *(int*)a - *(int*)b;\
}\

// 原地分區:奇數前、偶數後,返回奇數個數\
int partition_odd_even(int arr[], int n) {\
    int left = 0, right = n - 1;\
    while (left < right) {\
        while (left < right && (arr[left] & 1)) ++left;\
        while (left < right && !(arr[right] & 1)) --right;\
        if (left < right) {\
            int t = arr[left]; arr[left] = arr[right]; arr[right] = t;\
        }\
    }\
    return (arr[left] & 1) ? left + 1 : left;\
}\

int main() {\
    int arr[] = {10,9,8,7,6,5,4,3,2,1};\
    int n = 10;\
    int odd_cnt = partition_odd_even(arr, n);\
    qsort(arr, odd_cnt, sizeof(int), cmp_asc);\
    qsort(arr + odd_cnt, n - odd_cnt, sizeof(int), cmp_asc);\
    for (int i = 0; i < n; ++i) printf("%d ", arr[i]);\
}

此版本空間 O(1)、時間 O(n log n),更符合工程標準。原版作為教學演示清晰展示「分離→排序→合併」三階段思想,兩者各有價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved