剑指offer-第三章高质量的代码(调整数组顺序使得奇数位于偶数的前面)

题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部。

思路:用两个指针p1和p2,分别指向数组的头和尾部,p1只向后移,p2只向前移。当满足p1<p2这个条件时,可以将p1向后移并找到第一偶数为止,p2向前移直到找到第一个奇数为止,此时如果还满足p1<p2的条件,则交换p1和p2的值。

c++代码:本代码扩展性的体现为:将函数bool (*func) (int)当做参数传人preorder中,而此时要判断数字的奇偶性,可以写一个如上格式所示的函数:bool isEven(int n).

当题目改变,要求将数组中能整除3的数放在前面,其他的数组放在后面的时候,就可以写一个如上格式所示的其他函数。

#include<iostream>
using namespace std;
void preorder(int* pdata,unsigned int length,bool (*func) (int))
{
    if(pdata==NULL||length==0)
        return;
    int* pstart=pdata;
    int* pend=pdata+length-1;
    while(pstart<pend)
    {
        while(pstart<pend&&!func(*pstart))
            pstart++;
        while(pstart<pend&&func(*pend))
            pend--;
        if(pstart<pend)
        {
            int temp=*pstart;
            *pstart=*pend;
            *pend=temp;
        }
    }

}
bool isEven(int n)
{
    return (n&1)==0;
}
void preorderOddEven(int* pdata,unsigned int length)
{
    preorder(pdata,length,isEven);
}
void main()
{
    int a[5]={1,2,3,4,5};
    int* pdata=a;
    preorderOddEven(pdata,5);
    for(int i=0;i<5;i++)
        cout<<pdata[i]<<" ";
    cout<<endl;

}

Java代码:体现扩展性的方法是写一个接口,里面放一个抽象方法boolean func(int n),其他具体的题目,都只要实现这个方法即可。

public class PreorderOddEven {
    /*
     * 将一个数组中的奇数排在偶数的前面
     * @param pdata 数组
     * @param length 数组的长度
     */
    public void preorder(int[] pdata,int length)
    {
        if(pdata==null||length<=0)
            return;
        int pstart=0;
        int pend=length-1;
        while(pstart<pend)
        {
            while(pstart<pend&&!isEven(pdata[pstart]))
                pstart++;
            while(pstart<pend&&isEven(pdata[pend]))
                pend--;
            if(pstart<pend)
            {
                int temp=pdata[pstart];
                pdata[pstart]=pdata[pend];
                pdata[pend]=temp;
            }
        }

    }
    /*
     * 判断数组中数字的奇偶性
     * @param n 数组中的数字
     */
    public  boolean isEven(int n) {
        return (n&1)==0;
    }
    public static void main(String[] args)
    {
        PreorderOddEven poe=new PreorderOddEven();
        int[] a={1,2,3,4,5};
        poe.preorder(a,a.length);
        for(int i=0;i<5;i++)
            System.out.print(a[i]+" ");

    }
}

 

posted @ 2015-06-11 16:08  lisahappy  阅读(266)  评论(0编辑  收藏  举报