题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,
使得所有的奇数位于数组的前半部门,所有的偶数位于数组的后半部门。
这一题一看其实是很简单的,当然在不考虑效率的情况可以这样考虑
我们将数组从前开始索引只要发现偶数这将偶数取出来并且将偶数后
面的元素全部前移一个然后将偶数插入到最后,这样扫描一遍之后
就将偶数全部放在了后半部门,奇数放在了前半部分。但是效率不好
每次遇到偶数都要移动偶数后面的所有元素再加上遍历数组的时间
则达到了O(n2)
我们可以用两个索引或者指针,一个指向数组的末尾一个指向数组的开始。
1.前面的索引向后移动直到遇到偶数,后面的索引向前索引直到遇到奇数
2.交换两个元素
3.重复步骤1,2知道后面的的索引与前面的索引相遇或者在前面的索引之前则结束。
实现代码如下:
1 #include <iostream> 2 using namespace std; 3 4 void RecorderOddEven(int *pData,int length) 5 { 6 int p1,p2; 7 p1=0; 8 p2=length-1; 9 10 while(p2>p1) 11 { 12 while(p2>p1&&pData[p1]%2!=0) 13 p1++; 14 while(p2>p1&&pData[p2]%2==0) 15 p2--; 16 17 int temp; 18 temp=pData[p1]; 19 pData[p1]=pData[p2]; 20 pData[p2]=temp; 21 } 22 } 23 24 int main(int argc, char* argv[]) 25 { 26 int nums[5]={1,2,3,4,5}; 27 int length=5; 28 RecorderOddEven(nums,length); 29 for(int i=0;i<length;i++) 30 { 31 cout<<nums[i]<<","; 32 } 33 cout<<endl; 34 return 0; 35 }
运行截图: