劍指offer(面試題21):根據給定條件劃分陣列
阿新 • • 發佈:2019-02-11
/*
* 題目
* 輸入一個數組,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分
* 偶數位於陣列的後半部分
* 同時考慮程式碼的可擴充套件行
*/
#include <iostream>
using namespace std;
// 不考慮可擴充套件性
void ReorderOddEven(int* pData, unsigned int length) {
if(pData == NULL || length == 0)
return;
int* pBegin = pData;
int* pEnd = pData + length - 1 ;
while(pBegin < pEnd && (*pBegin & 0x1) != 0)
pBegin ++;
while(pBegin < pEnd && (*pEnd & 0x1) == 0)
pEnd--;
if(pBegin < pEnd) {
int tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
}
}
// 當題目要求改成,將陣列分為這樣的兩部分:負數在非負數的前面,或者能被3整除的放在不能被3整除的前面
// 考慮將判斷條件作為函式指標傳入
void Reorder(int * pData, unsigned int length, bool (*func)(int)) {
if(pData == NULL || length == 0)
return;
int* pBegin = pData;
int* pEnd = pData + length - 1;
while(pBegin < pEnd) {
while(pBegin < pEnd && (!func(*pBegin)))
pBegin++;
while(pBegin < pEnd && func(*pEnd ))
pEnd--;
if(pBegin < pEnd) {
int tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
}
}
}
bool isEven(int n) {
return (n & 1) == 0;
}
bool isPositive(int n) {
return n >= 0;
}
int main(int argc, char const *argv[]) {
int pData[] = {1,2,3,4,5};
Reorder(pData, 5, isEven);
int length = 5;
for(int i = 0; i < length; i++)
cout << pData[i] << " ";
cout << endl;
int pData1[] = {2,-3,-4,3,0};
Reorder(pData1, 5, isPositive);
for(int i = 0; i < length; i++)
cout << pData1[i] << " ";
cout << endl;
return 0;
}