数据结构练习(22)调整数组顺序使奇数位于偶数前面

http://zhedahht.blog.163.com/blog/static/25411174200741295930898/

文章中提到的第三点很好,CALLBACK函数很有启发意义:

在函数Reorder中,用函数指针func指向的函数来判断一个数字是不是符合给定的条件,而不是用在代码直接判断(hard code)。这样的好处是把调整顺序的算法和调整的标准分开了(即解耦,decouple)。当调整的标准改变时,Reorder的代码不需要修改,只需要提供一个新的确定调整标准的函数即可,提高了代码的可维护性。例如要求把负数放在非负数的前面,我们不需要修改Reorder的代码,只需添加一个函数来判断整数是不是非负数。这样的思路在很多库中都有广泛的应用,比如在STL的很多算法函数中都有一个仿函数(functor)的参数(当然仿函数不是函数指针,但其思想是一样的)。如果在面试中能够想到这一层,无疑能给面试官留下很好的印象。

#include <cstdio>

typedef bool (*pFn)(int);

bool is_even(int n)
{
    return (n & 0x01) == 0;
}

void re_order(int *data, unsigned length, pFn func)
{
    if (data == nullptr || length == 0)
        return;

    int *s = data;
    int *e = data + length - 1;

    while (s < e)
    {
        if (!func(*s))
        {
            ++s;  continue;
        }
        if (func(*e))
        {
            --e;  continue;
        }
        int t = *s;
        *s = *e; *e = t;
    }
}

int main()
{
    const int len = 7;
    int arr[len+1] = {1, 2, 3, 4, 5, 6, 7};

    re_order(arr, len, is_even);

    for (int i = 0; i < len; ++i)
        printf("%d ", arr[i]);

    return 0;
}

 

posted @ 2012-12-14 16:19  kedebug  阅读(340)  评论(0编辑  收藏  举报