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

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    MD5消息摘要算法的那些事
    关系数据库设计范式介绍(第一范式,第二范式,第三范式)
    C# string byte数组转换解析
    c#中FTP上传下载
    CString/string 区别及其转化
    伟大的神器 pjax 在thinkphp中的应用
    js jquery 判断当前窗口的激活点
    widget 传参数问题
    常见适用的函数
    thinkphp 分页函数
  • 原文地址:https://www.cnblogs.com/kedebug/p/2818255.html
Copyright © 2020-2023  润新知