调整数组顺序使奇数位于偶数前面

来源:互联网 发布:手机刷机数据恢复 编辑:程序博客网 时间:2024/06/06 19:16

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

注意:相对位置不变,考虑到冒泡排序、插入排序、归并排序等稳定的排序算法。

1、冒泡思想:时间复杂度O(n^2)

class Solution {public:    void reOrderArray(vector<int> &array)     {        int len=array.size();        if(len<=0) return;                for(int i=0;i<len;i++)        {            for(int j=len-1;j>i;j--)            {                if(!(array[j-1]&0X1)&&(array[j]&0X1))                    swap(array[j-1],array[j]);            }        }            }};

2、外排+插入思想:时间复杂度O(n^2)

 * 1.要想保证原有次序,则只能顺次移动或相邻交换。
 * 2.i从左向右遍历,找到第一个偶数。
 * 3.j从i+1开始向后找,直到找到第一个奇数。
 * 4.将[i,...,j-1]的元素整体后移一位,最后将找到的奇数放入i位置,然后i++。
 * 5.終止條件:j向後遍歷查找失敗。

class Solution {public:    void reOrderArray(vector<int> &array) {        int len=array.size();        if(len<=0) return;                for(int i=0;i<len;i++)        {            //寻找第一个偶数,i位置为偶数            while(i<len&&(array[i]&0x1))                i++;            //从偶数下一个位置开始查找第一个奇数            int j=i+1;            while(j<len&&!(array[j]&0x1))                j++;            //j位置为奇数,将i~j之间的偶数后移,这个奇数插入i位置            if(j<len)            {                int tmp=array[j];                for(int k=j-1;k>=i;k--)                    array[k+1]=array[k];                array[i]=tmp;            }            else//查找失败                break;                    }    }};

3、插入排序思想:时间复杂度为O(n^2)

class Solution {public:    void reOrderArray(vector<int> &array) {        int len=array.size();        if(len<=0) return;                //依次将每个元素插入到所在位置        int i,j;        for(i=0;i<len;i++)        {            //若array[i]为奇数,需要把它插入到奇数部分            if(array[i]&0x1)            {                int tmp=array[i];//哨兵                //从后向前查找待插入位置                for(j=i-1;j>=0&&!(array[j]&0x1);j--)                    array[j+1]=array[j];//向后移位                array[j+1]=tmp;//复制到插入位置            }        }    }};

4、空间换时间:时间复杂度O(n) 空间复杂度O(n) 

class Solution {public:    void reOrderArray(vector<int> &array) {        if(array.size()<=0) return;        int begin=0;//指向第一个元素        int end=array.size()-1;//指向末尾元素        vector<int> temp;        for(int i=0;i<array.size();i++)            temp.push_back(array[i]);        int i=0,j=0;        for(i=0;i<temp.size();i++)        {            if((temp[i]&0x1)==1)//奇数                array[j++]=temp[i];        }        for(i=0;i<temp.size();i++)        {            if((temp[i]&0x1)==0)//偶数                array[j++]=temp[i];        }    }};


1 0