数据结构练习(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;

}

 

你可能感兴趣的:(数据结构)