【剑指offer】面试题14:调整数组顺序使奇数位于偶数前面

来源:互联网 发布:java反射调用方法 编辑:程序博客网 时间:2024/04/30 12:38
//调整数组顺序使奇数位于偶数前面#include<iostream>using namespace std;//基本解法void ReorderOddEven(int *pData, int length){    if (pData == NULL || length <= 0)    {        return;    }    //定义两个指针    int *pBegin = pData;    int *pEnd = pData + length - 1;    while (pBegin < pEnd)    {        while ((pBegin<pEnd)&&(*pBegin & 1))//注意添加另外一个限制条件(pBegin<pEnd)        {            ++pBegin;        }        while ((pBegin<pEnd)&&((*pEnd & 1) == 0))        {            --pEnd;        }        if (pBegin < pEnd)        {            int temp = *pBegin;            *pBegin = *pEnd;            *pEnd = temp;        }    }}

考虑可扩展性的解法:

如果题目改为:数组按照大小分为两部分,所有负数都在非负数的前面。
或者改为分为两部分,能被3整除的放到前面,不能被整除的放到后面。
该如何解决:
大的逻辑框架不用改变,把判断的标准改为一个函数指针。
可以把整个函数分为两个部分:一是判断数字是在数组中的前半段还是后半段。2.拆分数组的操作

bool isEven(int n)//判断是否为偶数{    return (n & 1) == 0;}void ReorderOddEven(int *pData, int length, bool(*func)(int)){    if (pData == NULL || length <= 0)    {        return;    }    //定义两个指针    int *pBegin = pData;    int *pEnd = pData + length - 1;    while (pBegin < pEnd)    {        while ((pBegin<pEnd) && (!func(*pBegin)))//注意添加另外一个限制条件(pBegin<pEnd)        {            ++pBegin;        }        while ((pBegin<pEnd) && func(*pBegin))//函数指针可以直接当函数名进行使用        {            --pEnd;        }        if (pBegin < pEnd)        {            int temp = *pBegin;            *pBegin = *pEnd;            *pEnd = temp;        }    }}

测试函数:

int main(){    int number[] = {5,2,6,7,8,9,1};    ReorderOddEven(number, 7);    for (int i = 0; i < 7; ++i)    {        printf("%d ", number[i]);    }    printf("\n");    return 0;}

这里写图片描述

0 0