算法设计(要求用C++或者C语言描述算法) 已知数组A[n]中的元素是整型,设计算法将其调整为左右两部分,其中左边是奇数,右边是偶数,并要求算法的时间复杂度是O(n)。
时间: 2024-09-08 14:04:24 浏览: 120
数组中求最小元素——C++代码
可以使用双指针技术来解决这个问题,这种算法被称为“偶奇分隔”或“奇偶排序”。这里是一个简单的C++实现:
```cpp
#include <iostream>
void separateNumbers(int A[], int n) {
if (n <= 0 || !A) return; // 如果数组为空或者长度为0,直接返回
int left = 0, right = n - 1; // 定义两个指针,left指向左侧奇数,right指向右侧偶数
while (left < right) {
// 当左指针未超过右指针时,继续循环
while (left < right && A[left] % 2 == 0) { // 跳过左侧的偶数
left++;
}
if (left < right) { // 将左侧的第一个奇数移动到中间
std::swap(A[left], A[right]);
left++; // 移动左指针
}
while (left < right && A[right] % 2 != 0) { // 跳过右侧的奇数
right--;
}
// 同理,将右侧的第一个偶数移到左侧
if (left < right) {
std::swap(A[left], A[right]);
right--; // 移动右指针
}
}
}
// 测试函数
int main() {
int arr[] = {4, 2, 5, 7, 1, 8, 3, 6};
int n = sizeof(arr) / sizeof(arr[0]);
separateNumbers(arr, n);
for (int i : arr) {
std::cout << i << " ";
}
return 0;
}
```
这个算法首先检查数组是否有效,然后使用两个指针分别从两端开始遍历。当遇到第一个奇数或偶数时,就与另一端对应的数交换位置,直到两个指针相遇为止。由于每个元素最多被移动一次,所以时间复杂度是O(n)。
阅读全文