1. 程式人生 > >劍指offer:調整陣列順序

劍指offer:調整陣列順序

題目:調整陣列順序,使奇數位於偶數前面。

輸入一個整形陣列,實現一個函式調整陣列中數字順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。

整體思路

思路1

     掃描陣列,前指標指向第一個數字,向後走;後指標指向最後一個數字,向前走,若偶數在奇數前面,交換這兩數字。

程式碼

#include<stdio.h>

void ReoederOddEven(int *pData, unsigned int length)
{
	if (pData == NULL || length == 0)
	{
		return;
	}
	int *pBegin = pData;
	int *pEnd = pData + length - 1;

	while (pBegin < pEnd) // *pBegin  *pEnd 代表裡面的數字
	{
		
		while (pBegin < pEnd && (*pBegin & 0x1)!=0) //向後移動begin,直到它指向偶數
		{
			pBegin++;
		}
		
		while (pBegin < pEnd && (*pEnd & 0x1)==0)//向前移動pEnd,直到它指向奇數
		{
			pEnd--;
		}
		if (pBegin < pEnd) // 交換偶數和奇數
		{
			int t = *pBegin;
			*pBegin = *pEnd;
			*pEnd = t;
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5 };
	ReoederOddEven(arr, sizeof(arr) / sizeof(arr[0]));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

執行結果

1     5     3     4    2

思路2

      函式指標寫法,可提高擴充套件性
      為了讓程式碼的擴充套件性更強,可以將這些判斷標準單獨寫成一個函式介面,而主程式碼框架保持不變。
      將邏輯框架抽象出來,把判斷標準變成一個函式指標,也就是用一個函式來判斷數字是不是符合標準。

程式碼: 

#include<stdio.h>

bool isEven(int n);
void ReoederOddEven(int *pData, unsigned int length);
void Reorder(int *pData, unsigned int length, bool(*func)(int));

bool isEven(int n)//  1&1  奇數 1==0 ?  1≠0  返回 0  說明是奇數   
{
	return(n & 1) == 0;
}


//把函式指標當成一個引數,聲明瞭一個指標func,指向了函式 呼叫 func(3,4)或(*func)(3,4)
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) // *pBegin  *pEnd 代表裡面的數字
	{
        // !func(*pBegin)表示 *pBegin %2 != 0 
		while (pBegin < pEnd && !func(*pBegin)) //向後移動begin,直到它指向偶數
		{
			pBegin++;
		}
		// func(*pEnd) 表示 *pEnd % 2 == 0
		while (pBegin < pEnd && func(*pEnd))// 向前移動pEnd,直到它指向奇數
		{
			pEnd--;
	    }
		if (pBegin < pEnd) // 交換偶數和奇數
		{
			int t = *pBegin;
			*pBegin = *pEnd;
			*pEnd = t;
		}
	}
}

void ReoederOddEven(int *pData, unsigned int length)
{
	Reorder(pData, length, isEven);
}

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	ReoederOddEven(arr1, sizeof(arr1)/sizeof(arr1[0]));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	return 0;
}

執行結果

1     5     3     4    2