题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
注:这个题在书中没有要求奇数和奇数,偶数和偶数之间的相对位置不变。
思路1
遍历整个数组,当遇到偶数时,将该偶数后面的数前移一个位置并把该偶数放到数组末尾。这个算法时间复杂度为O(n^2),但可以保证奇数和奇数,偶数和偶数之间的相对位置不变。代码如下:
class Solution { public: void reOrderArray(vector<int> &array) { int len = array.size(); if(len==0) return; int evenNums = 0; //数组中偶数个数 for(int i=0; i<len; i++) if(array[i]%2==0) evenNums++; int i=0; while(i<len && evenNums){ //注意循环条件 if(array[i]%2==0){ int t = array[i]; for(int j=i; j<len-1; j++) array[j] = array[j+1]; array[len-1] = t; evenNums--; } else i++; //只有当当前值为奇数时才+1 } } };
思路2
该解法类似于快速排序中的partition过程,维护两个指针p1, p2,p1初始指向数组第一个位置,p2指向数组末尾,然后p1向后移动,p2向前移动,当p1指向的值为偶数且p2指向的值为奇数时,交换p1,p2指向的值,直至p1>=p2。
代码如下:
class Solution { public: void reOrderArray(vector<int> &array) { int left = 0; int right = array.size()-1; while(left<right){ while(left<right && array[left]%2!=0) left++; while(left<right && array[right]%2==0) right--; if(left<right){ int t = array[left]; array[left]=array[right]; array[right]=t; } } } };
该解法时间复杂度为O(n),但不能保证奇数和奇数,偶数和偶数之间的相对位置不变,所以在牛客网无法通过。
来源:https://www.cnblogs.com/flix/p/12448044.html