剑指offer面试题14 调整数组元素顺序使得奇数在前半部分偶数在后半部分

这个自己相想了一个快排思想的 测试了 应该是没有问题。:-) 
双指针用过很多次了。。这里最主要的一个问题是我第一次用函数指针 主要针对可扩展性的
/*
这题也是自己一下子就想到了 一个是双指针 一个是快排的思想。。
标准解法是双指针,但是这里提到了一个非常重要的问题
就是扩展性 如果面试官问 不按奇数偶数排序 而是按照 正负呢 如果按照 是不是三的倍数呢?
这里就要用函数指针了。。。好激动啊。。第一个用函数指针
*/

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1000;

//双指针 每次从前找偶数 从后找奇数 如果找到后发现start< end就交换
//函数指针的定义 返回值 括号内*func 后面括号返回值

bool isEven(int n)
{
    return (n & 0x1)==0;
}
void ReorderWithDoublePointer(int arr[],int n,bool (*func)(int))
{
    if(arr== NULL || n==0)
        return ;
    int * start=arr,*end=arr+n-1;
    while(start<end)
    {
        while(start<end  && !func(*start))//原来必须加0x 因为1 模式是bool的
        start++;
        while(start<end &&  func(*end))
        end --;
        if(start < end)
        {
            int tmp=* start ;
            * start = * end;
            *end =tmp;
        }
    }
}

void ReorderwithPartition(int arr[],int n,bool (*fun)(int))
{
    if(arr==NULL || n==0)
    return ;
    int index=-1;
    for(int i=0;i<n;++i)
    {
        if(!fun(arr[i]))//如果发现奇数 要移动到前面
        {
            index++;//这个奇数出现的位置应该是index
            if(index!=i)//应该出现的位置和现在的位置不一样 要swap
            {
                int t=arr[index];
                arr[index]=arr[i];
                arr[i]=t;
            }
        }
    }
}


int main()
{
    int arr[maxn];
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;++i)
        scanf("%d",&arr[i]);
      //  ReorderWithDoublePointer(arr,n,isEven);//这里直接输入函数名
        ReorderwithPartition(arr,n,isEven);
        for(int i=0;i<n;++i)
        {
            printf("%d\t",arr[i]);
        }
        printf("\n");
        return 0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值