调整数组使奇数全部都位于偶数前面。
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
我用冒泡实现了这个要求:
#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;
}
这个方法大家可以在纸上画一下, 也不难理解, 就是类似于二分法交换, 只不过左侧指针和右侧指针不是同时移动而已:
当左侧是偶数时, 指针不移动准备被交换, 若为奇数则不需被交换, 指针后移;
当右侧为奇数时, 指针不移动准备被交换, 若为偶数则不需被交换, 指针前移;
个人感觉还是第一种方法比较好, 易于理解.