描述

这是一篇面对初级coder的题解。
知识点:队列 指针 排序
难度:二星


题解

题目:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
为了优化代码,思考如何判断奇数和偶数效率最高
if(x&1)
这样应该只用一个指令周期就能完成判断 开始跳转——有对编译原理感兴趣的同学欢迎讨论

方法一:队列

比较直观的想法是用队列把数组复制一份
一个奇数队列一个偶数队列
整理好再放回原队列

#include <queue>
class Solution {
public:
    vector<int> reOrderArray(vector<int>& array) {
         queue<int> odd ;
         queue<int> even ;
         for(int i = 0 ; i <array.size() ;i++){ //第一次遍历,存入两个队列
             if(array[i]&1)
                  odd.push(array[i]);
             else
                  even.push(array[i]);
         }
        int len_odd=odd.size();
        int len_even=even.size();
        int i;
         for(i = 0 ; i <len_odd ;i++){//第二次遍历,从奇数队列中存入原数组
             array[i]=odd.front();
             odd.pop();
         }
         for(; i <array.size() ;i++){//第二次遍历,从偶数队列中存入原数组
             array[i]=even.front();
             even.pop();
         }
        return array;
    }
};
<array.size>
</array.size>
显然,这样执行效率不高
运行时间: 13 ms 占用内存:1576K
时间复杂度O(2n)
空间复杂度O(n)

方法二:冒泡排序的思想

利用冒泡排序的思想,找到奇数就排到前面

class Solution {
public:
    vectorreOrderArray(vector& array) {
        int odd_num=0;//奇数记录
        int cur_num;
        int i,j;
        for(i=0;i<array.size>=odd_num;j--) 
                    array[j]=array[j-1];
                array[odd_num]=cur_num;
                odd_num++;
            }
        }
        return array;
    }
};</array.size>
运行时间: 125 ms 占用内存:1552K

时间复杂度:O(n2),同冒泡排序

空间复杂度:O(1)

总结

排序题的扩展考法
需要熟悉经典的排序方法
排序算法的时间和空间不可兼得,