剑指OFFER——调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
剑指offer书里的版本,没有要求相对位置不变,而是给出了函数指针版本,替换判断是奇数的函数,可以提供将满足X条件的数字挪到不满足X条件的数字前面。
快速排序的变形,和书上的不一样,我用了几乎非常接近快速排序的代码:
class Solution { public: void reOrderArray(vector<int> &array) { int temp=array[0]; int s=array.size(); int i=0; int j=s-1; while(i<j){ while(array[j]%2==0) j--; if(i<j) array[i++]=array[j]; while(array[i]%2==1) i++; if(i<j) array[j--]=array[i]; } array[i]=temp; } };
不改变相对位置的版本:
class Solution { public: void reOrderArray(vector<int> &array) { vector<int> temp(array); int s=array.size(); int count1=0;//表示奇数个数 int count2=0;//表示偶数个数 for(int i=0,j=s-1;i<s&&j>=0;i++,j--){ if(temp[i]%2==1){ array[count1]=temp[i]; count1++; } //前面安置奇数,后面安置偶数 if(temp[j]%2==0){ array[s-1-count2]=temp[j];//从后扫描的第一个偶数,被放在最后的位置 count2++; } } } };