面试题 14, 调整数组顺序使奇数位于偶数前面(学会运用面向对象,模板和抽象类)

思路和答案一样,利用类似快排的方法,两个指针从首尾向中间靠拢,然后互换指针所指的奇偶两数。

书中有两种解法,简单解法和拓展解法,简单解法只能排序奇偶数。拓展解法将判断函数分离了开来,可以自己编写判断函数,排序奇偶,3的倍数,正负数等等。

这里只讨论拓展解法。

我的拓展解法和答案略有不同。

我的解法,定义一个模板抽象类Rearrange,判断函数是抽象函数。随后定义RearrangeEvenOdd继承Rearrange,在子类中实现了判断函数,如果是偶数返回false。

代码:

#include <stdio.h>

template<class T>
class Rearrange
{
public:
    Rearrange(){}
    void execute(T* array, int size){//method to do the rearrange.
        int start = 0;
        int end = size - 1;
        while(start < end){
            while(judge(array[start]) && start < size){
                start++;
            }
            while(!judge(array[end]) && end >= 0){
                end--;
            }
            if(start < end){
                innerExchange(array, start, end);
            }
            
        }
    }
    virtual bool judge(T value) = 0;
private:
    void innerExchange(T* array, int p1, int p2){
        printf("start: %d, end: %d, switch %d and %d\n", p1, p2, array[p1], array[p2] );
        T temp = array[p1];
        array[p1] = array[p2];
        array[p2] = temp;
    }
};

class RearrangeEvenOdd : public Rearrange<int>
{
public:
    RearrangeEvenOdd(){}
    bool judge(int value){
        return value%2;
    }
};

int main(){
    int toArrange[8] = {12, 3 ,90, 5, 9, 12, 98, 100};
    RearrangeEvenOdd rearrangeEvenOdd;
    rearrangeEvenOdd.execute(toArrange, 8);
    
    for(int i = 0; i < 8;i++){
        printf("%d ", toArrange[i]);
    }
    return 0;
} 

测试通过

 

书中代码,没有上升到类级别,还是函数形式。

posted on 2014-01-12 12:46  Felix Fang  阅读(206)  评论(0)    收藏  举报

导航