1. 程式人生 > >輸入一個整數陣列,實現一個函式, 來調整該陣列中數字的順序使得陣列中所有的奇數位於陣列的前半部分, 所有偶數位於陣列的後半部分。

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

調整陣列使奇數全部都位於偶數前面。

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

我用冒泡實現了這個要求:

#include <stdio.h>
#include <windows.h>
/*
	輸入一個整數陣列,實現一個函式,
	來調整該陣列中數字的順序使得陣列中所有的奇數位於陣列的前半部分,
	所有偶數位於陣列的後半部分。
*/
//寫一個函式,用冒泡方法
void Sort(int num[], int len) {
	for (int i = 0; i < len - 1; ++i) {
		for (int j = 0; j < len - i - 1; ++j) {
			if (num[j] % 2 == 0 && num[j + 1] % 2 != 0) {
				int tmp = num[j];
				num[j] = num[j + 1];
				num[j + 1] = tmp;
			}
		}
	}
}
//void Sort(int* num, int len) {
//	for (int i = 0; i < len - 1; ++i) {
//		for (int j = 0; j < len - i - 1; ++j) {
//			if (*(num + j) % 2 == 0 && *(num + j + 1) % 2 != 0) {
//				int tmp = *(num + j);
//				*(num + j) = *(num + j + 1);
//				*(num + j + 1) = tmp;
//			}
//		}
//	}
//}

int main() {
	int num[] = { 3, 4, 7, 8, 12, 1 };
	Sort(num, sizeof(num) / sizeof(int));
	for (int i = 0; i < sizeof(num) / sizeof(int); ++i) {
		printf("%d ", num[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

冒泡有順序比較相鄰元素的特性, 因此用冒泡迴圈, 每次相鄰元素符合偶數在前,奇數在後時,就把他倆交換即可.

還有一種用二分法實現

void Sort(int* arr, int len)
{
	int* start = arr;      //左邊起始位置
	int* end = arr + len - 1;     //右邊起始位置
	int i = 0;
	int j = len - 1;
	while (i < j)
	{
		
		if (arr[i] % 2 == 0) {
			arr[i] = arr[i];
		} else {
			++i;
		}
		if (arr[j] % 2 == 1) {
			arr[j] = arr[j];
		} else {
			--j;
		}
		swap(arr[i],arr[j]);
	}
}
int main()
{
	int arr[] = {3, 4, 7, 8, 12, 1};
	adjust(arr, sizeof(num) / sizeof(int));
	for (int i = 0; i < sizeof(num) / sizeof(int); ++i)
	printf("%d  ", tmp[i]);
	system("pause");
	return 0;
}

這個方法大家可以在紙上畫一下, 也不難理解, 就是類似於二分法交換, 只不過左側指標和右側指標不是同時移動而已:
當左側是偶數時, 指標不移動準備被交換, 若為奇數則不需被交換, 指標後移;
當右側為奇數時, 指標不移動準備被交換, 若為偶數則不需被交換, 指標前移;

個人感覺還是第一種方法比較好, 易於理解.