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

//调整数组顺序使奇数位于偶数前面
#include
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*pBegin & 1))//注意添加另外一个限制条件(pBeginwhile ((pBegin*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*pBegin)))//注意添加另外一个限制条件(pBeginwhile ((pBegin*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;
}

这里写图片描述

你可能感兴趣的:(每天十道编程题)