调整输入数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数
时间: 2024-09-15 15:02:37 浏览: 123
要将一个整数数组 `A` 分割成两个部分,使得左侧(索引从 0 到某个位置 `i`)包含所有的奇数,而右侧(索引从 `i+1` 到 `n`)包含所有的偶数,你可以使用双指针技术。这可以通过以下步骤完成:
1. 初始化两个指针,一个 `left` 指针用于查找下一个奇数的位置,另一个 `right` 指针用于查找下一个偶数的位置。初始时,`left = 0` 和 `right = 0`。
2. 当 `left < right` 时,循环执行以下操作:
a. 如果 `A[left]` 是奇数并且 `right` 尚未超过数组长度,将 `left` 加一并继续检查。
b. 否则,如果 `A[right]` 是偶数,将 `right` 加一,因为已经找到了一个偶数。
c. 如果当前 `left` 指向的元素不是奇数并且 `right` 指向的元素不是偶数,则交换它们的位置。
3. 循环结束后,`left` 的位置就是分割点,将数组 `A` 中从 0 到 `left` 的部分视为奇数部分,剩下的从 `left + 1` 到 `n` 的部分视为偶数部分。
以下是用 C++ 实现的一个示例:
```cpp
#include <vector>
int partition(std::vector<int>& A) {
int left = 0, right = 0;
while (left < A.size()) {
if (A[left] % 2 == 1 && left != right) {
std::swap(A[left], A[right]);
right++;
} else {
left++;
}
}
return left; // 返回分割点 index
}
// 示例用法
int main() {
std::vector<int> A = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int splitIndex = partition(A);
for (int i : A) {
if (i <= splitIndex) {
std::cout << "Odd: " << i << " ";
} else {
std::cout << "Even: " << i << " ";
}
}
return 0;
}
```
运行这个程序后,你会看到输出像 "Odd: 1 3 5 7 9 Even: 2 4 6 8 " 这样的结果。
阅读全文