面试题 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; }
测试通过
书中代码,没有上升到类级别,还是函数形式。

------------------------------------------------
Felix原创,转载请注明出处,感谢博客园!
posted on 2014-01-12 12:46 Felix Fang 阅读(206) 评论(0) 收藏 举报
浙公网安备 33010602011771号