題目:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,偶數位於後半部分。
思路:這個題目要求把奇數放在數組的前半部分,偶數放在數組的後半部分,因此數組中所有奇數位於偶數前面。我們在掃描這個數組時,遇到偶數在奇數前面時可以交換一下它們的順序。因此我們可以定義兩個指針pBengin、pEnd,pBegin指向數組的首地址,pEnd指向數組的最後一位,當pBengin指向的數字爲奇數時,pbengin向後移動,當指向的數字爲偶數時,先不動。當pEnd指向的數字爲偶數時不動,奇數時向前移動。在沒有相遇之前奇數總數位於偶數前面,如果第一個指向的位偶數第二個指向的爲奇數,可以交換這兩個數字。
代碼:
#include<iostream> using namespace std; void ReorderOddEven(int *arr,int length) { if(arr==NULL|| length==NULL) return; int *pBegin=arr; int *pEnd=arr+length-1; while(pBegin<pEnd) { while(pBegin<pEnd && (*pBegin%2)!=0)//向後移動直到它指向偶數 pBegin++; while(pBegin<pEnd && (*pEnd%2)==0)//向前移動直到它指向奇數 pEnd--; if(pBegin<pEnd) { int tmp=*pBegin; *pBegin=*pEnd; *pEnd=tmp; } } } int main() { int arr[]={1,2,3,4,5,6,7}; int sz=sizeof(arr)/sizeof(arr[0]); ReorderOddEven(arr,sz); for(int i=0;i<sz;i++) { cout<<arr[i]<<' '; } return 0; }