将数组的奇数放到偶数前面

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

 

思路:

声明两个指针,一个指向该数组的头,另一个指向该数组的尾,将头指针指向的第一个偶数和尾指针指向的第一个奇数交换即可,直到头指针大于尾指针跳出循环。

代码如下:

void tiaozheng(int *data,unsigned int length)
{
    if(data==NULL||length<=0)
        throw exception("参数错误!");
    int *begin=data;
    int *end=data+length-1;
    //将begin的第一个偶数和end的第一个奇数交换,直到begin>=end,这时所有奇数都在偶数前面
    while(begin<end)
    {
        //begin指向的数为奇数则begin++,是偶数则跳出循环
        while(begin<end && (*begin & 0x1)==1)
            begin++;
        //end指向的数为偶数则end++,是奇数数则跳出循环
        while(begin<end && (*end & 0x1)==0)
            end--;
        //如果begin<end则交换这两个数字
        if(begin<end)
        {
            int temp=*begin;
            *begin=*end;
            *end=temp;
        }
    }
}

上面的方法只能用于区分奇数和偶数,程序的通用性不高,例如如果需要将正数和负数分开则需要重新写一个函数,下面是一个用于解决此类问题的通用模板,如果需要划分正负数的话,将函数的参数func更改为判断正负数的函数即可。(本例中传入判断奇偶数的方法isjishu)

代码如下:

//判断是否是奇数的函数,奇数返回true,偶数返回false
bool isjishu(int x)
{
    if(x & 0x1==1)
        return true;
    else if(x & 0x1==0)
        return false;
}
//打印函数
void print(int *data,int length)
{
    int *begin=data;
    int count=0;
    while(count<length)
    {
        cout<<*begin<<"  ";
        begin++;
        count++;
    }
    cout<<endl;
}
//使用通用的模板解决此类问题
void tiaozheng2(int *data,unsigned int length,bool (*func)(int))
    {
    if(data==NULL||length<=0)
        throw exception("参数错误!");
    int *begin=data;
    int *end=data+length-1;
    //将begin的第一个偶数和end的第一个奇数交换,直到begin>=end,这时所有奇数都在偶数前面
    while(begin<end)
    {
        //begin指向的数为奇数则begin++,是偶数则跳出循环
        while(begin<end && func(*begin))
            begin++;
        //end指向的数为偶数则end++,是奇数数则跳出循环
        while(begin<end && !func(*end))
            end--;
        //如果begin<end则交换这两个数字
        if(begin<end)
        {
            int temp=*begin;
            *begin=*end;
            *end=temp;
        }
    }
}

测试代码及运行结果:

int main()
{
    int data[5]={1,2,3,4,5};
    print(data,5);
    tiaozheng2(data,5,isjishu);
    print(data,5);
    return 0;
}

posted @ 2015-05-22 15:48  runninglzw  阅读(566)  评论(0编辑  收藏  举报