首页 > 一道C语言小题目,能不能更简洁呢

一道C语言小题目,能不能更简洁呢

题目如下: 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 如输入数组1,4,2,7,8,9,输出结果为1,7,9,2,4,8。

#include <stdio.h>

#define N 10

int is_odd(int num)
{
    if(num % 2 != 0)
    return 1;
}

void init(int *array)
{
    int i;
    srand(time(NULL));
    for(i = 0; i < N; i ++)
        array[i] = rand() % 100;
}

void swap(int *i, int *j)
{
    int tmp;

    tmp = *i;
    *i = *j;
    *j = tmp;
}

void print(int *array)
{
    int i;

    for(i = 0; i < N; i ++)
        printf("%d ", array[i]);
    printf("\n");
}

void sort(int *array)
{
    int i = 0, j = N - 1;

    for(i = 0; i < j; i ++){
        if(! is_odd(array[i]))
            for(j = N - 1; j > i; j --)
                if(is_odd(array[j])){
                    swap(array + i, array + j);
                    break;  
                }
    }
}

int main(int argc,  char ** argv)
{
    int array[N];

    init(array);
    print(array);
    sort(array);
    print(array);   

    return 0;
}

没细看代码,但是看了下楼主的sort方法,时间复杂度是平方级的

其实这个排序可以随便使用 快排、归并、堆排序来解决(这些算法的平均时间复杂度都是0(NlogN)),对于你的需求,只是额外需要自定义元素比较方法即可:

如果两个是同一类数字(比如奇数),则按照具体值比较,否则不同类数字(一个是奇数,一个是偶数),则奇数大于任何偶数


Dutch National Flag Problem http://en.wikipedia.org/wiki/Dutch_national_flag_problem


最简单的方法是分配一个新的同样大的数组,扫描原数组,奇数从前往后放到新数组,偶数从后往前放新数组,然后拷贝回来,释放新数组。这个代码太简单了,我就不写了。

下面是个更快一点、只需要O(1)空间的算法,也许你会觉得很眼熟。

void rearrange(int *a, int n)
{
    int i = 0, j = n - 1, t = a[0];
    while (i != j)
    {
        while (i < j && ((a[j] & 1) == 0))
            j--;
        if (i < j)
            a[i] = a[j], i++;
        while (i < j && ((a[i] & 1) == 1))
            i++;
        if (i < j)
            a[j] = a[i], j--;
    }
    a[i] = t;
}

【热门文章】
【热门文章】