1. 程式人生 > >劍指offer(面試題21):根據給定條件劃分陣列

劍指offer(面試題21):根據給定條件劃分陣列

/*
* 題目
* 輸入一個數組,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分
* 偶數位於陣列的後半部分
* 同時考慮程式碼的可擴充套件行
*/

#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; }