问题描述】调整输入数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数 【输入形式】a0,b1,b2,a1,a2,b3,a3,a4 【输出形式】a0,a1,a2,a3,a4,b1,b2,b3 【样例输入】1,2,33,8,5 【样例输出】1,33,5,2,8
时间: 2024-09-10 10:15:52 浏览: 103
这个问题可以通过双指针技术来解决。我们可以使用两个指针,一个从数组的开始位置出发,只向右移动,用于收集奇数;另一个从数组的末尾出发,只向左移动,用于收集偶数。当两个指针相遇时,交换它们所指的元素,然后继续各自移动,直到它们再次相遇。这样,当两个指针相遇时,左边都是奇数,右边都是偶数。
下面是C语言实现的代码:
```c
#include <stdio.h>
void rearrangeArray(int arr[], int n) {
int i = 0;
int j = n - 1;
while (i < j) {
// 移动左指针直到找到偶数
while (i < j && arr[i] % 2 != 0) i++;
// 移动右指针直到找到奇数
while (i < j && arr[j] % 2 == 0) j--;
// 当两个指针指向的元素分别是奇数和偶数时交换它们
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d", arr[i]);
if (i < n - 1) printf(",");
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 33, 8, 5};
int n = sizeof(arr) / sizeof(arr[0]);
rearrangeArray(arr, n);
printArray(arr, n);
return 0;
}
```
这段代码首先定义了一个`rearrangeArray`函数来调整数组,然后定义了一个`printArray`函数来打印数组。`main`函数中初始化了一个数组并调用了这两个函数来得到最终的结果。
阅读全文