剑指offer2之调整数组顺序使奇数位于偶数前面

前言

书上的题目相对简单,没有要求相对位置不改变,而在牛客网上的题目有要求。以牛客网的为准。

题目(调整数组顺序使奇数位于偶数前面)

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

算法思路

算法思路一

利用冒泡排序的思想,此时我们比较的是只要遇到奇数和偶数,那么就交换元素。

算法思路二

借助辅助数组。我们从前往后扫描数组将奇数放入数组中,再扫描一遍将偶数放入数组中,最后对数组赋值辅助数组。

算法思路三

利用双向队列的特性,即可以高效的在头尾两段插入和删除元素,我们可以从后往前扫描数组,将奇数依次往前插到队列,然后从后往前扫描数组,将偶数往后插入队列中,在保证顺序不变的同时得到所求。

算法实现

算法实现一

算法实现二

算法实现三

复杂度分析

算法一中,使用的过程类似冒泡排序,时间复杂度为 O(n^2),空间复杂度为 O(1);算法二中,对数组只有遍历,所以时间复杂度为 O(n),另外使用了辅助数组,所以空间复杂度为 O(n);算法三也是遍历一遍数组,时间复杂度为 O(n),另外使用了双端队列,空间复杂度为 O(n)。

参考

<<剑指offer2>>

-------------本文结束感谢您的阅读-------------