zoukankan      html  css  js  c++  java
  • 数据结构练习(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

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

  • 相关阅读:
    非常简洁的js图片轮播
    js广告图片轮播
    图片轮播
    分享到QQ空间、新浪微博、腾讯微博和人人网
    五星简单操作
    Struts2 多文件上传
    CSS3实践之路(六):CSS3的过渡效果(transition)与动画(animation)
    JavaScript中的数据类型
    JavaScript中对象是否需要加引号?
    变量提升(hoisting)
  • 原文地址:https://www.cnblogs.com/kedebug/p/2818255.html
Copyright © 2011-2022 走看看