C语言 给定一个整数数组,请调整数组中的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分,要求时间复杂度为O(n)
时间: 2024-10-23 20:15:41 浏览: 27
在C语言中,为了实现这个功能并保持时间复杂度为O(n),你可以使用双指针技巧,一种常见的数组排序算法。这里有一个简单的步骤描述:
1. 定义两个指针,一个 `left` 初始化为0,用于标记奇数区间的开始;另一个 `right` 初始化为数组长度减一,表示偶数区间的结束。
2. 当 `left < right` 时,继续循环执行以下操作:
a. 检查 `arr[left]` 是否为奇数(可以通过对 `arr[left]` 取模 2 确定)。如果是奇数,将 `left` 向右移动一位,并保留当前元素位置不变。
b. 检查 `arr[right]` 是否为偶数。如果是偶数,将 `right` 向左移动一位,同时保证它指向的始终是最后一个偶数。
c. 如果 `left` 指向的不是奇数而 `right` 指向的是偶数,交换这两个元素的位置。
3. 循环结束后,数组将会满足条件:奇数在前,偶数在后。
以下是伪代码形式的示例:
```c
void sort_odd_even(int arr[], int n) {
int left = 0;
int right = n - 1;
while (left < right) {
if (arr[left] % 2 != 0) { // 奇数
left++;
} else if (arr[right] % 2 == 0) { // 偶数
swap(&arr[left], &arr[right]);
right--;
} else { // 左边是奇数,右边也是奇数或者都是偶数
left++; // 都不动
}
}
}
```
阅读全文