zoukankan      html  css  js  c++  java
  • 将数组的奇数放到偶数前面

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

    思路:

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

    代码如下:

    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;
    }

  • 相关阅读:
    165. Compare Version Numbers
    164. Maximum Gap
    3、桶排序
    162. Find Peak Element
    160. Intersection of Two Linked Lists
    155. Min Stack
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    Linux/Unix系统编程手册 第二章:基本概念
    Linux/Unix系统编程手册 第一章:历史和标准
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4522561.html
Copyright © 2011-2022 走看看