/* [调整数组的顺序使奇数位于偶数的前面] [题目] 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分, 所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 [解析] 注意题目的意思,划分之后要求:保证奇数和奇数,偶数和偶数之间的相对位置不变。(因此不能使用快排的 partition 思想,这是不稳定的) 方法: 冒泡排序的思想:每次迭代将一个偶数下沉到恰当的位置(注意:只要遇到偶数在前奇数在后的情况才需要交换) 空间换时间:需要一个额外的数据,直接将数字移到恰当的位置。 */ #include <iostream> #include <vector> #include <algorithm> using namespace std; class Solution{ public: void reOrderArray(vector<int> &array){ //bubbling(array); assisSpace(array); } // time-O(n^2), spcae-O(1) void bubbling(vector<int>& array){ // move one of even number to the end in each iteration for(int i=0; i<array.size(); i++){ for(int j=0; j<(array.size()-i-1); j++){ if(isEven(array[j]) && !isEven(array[j+1])){ swap(array[j], array[j+1]); } } } } // time-O(n), space-O(n) void assisSpace(vector<int>& array){ int countOdd = 0; for(int n : array){ if(!isEven(n)) countOdd++; } vector<int> temp(array.size()); int iOdd = 0; int iEven = countOdd; for(int i=0; i<array.size(); i++){ if(isEven(array[i])){ temp[iEven++] = array[i]; }else{ temp[iOdd++] = array[i]; } } array.assign(temp.begin(), temp.end()); } static bool isEven(int n){ return (n & 1) == 0; } }; int main() { return 0; }
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15315.html