c++代码2. 已知线性表(a1,a2,a3,……,an)采用顺序表存储,且每个元素都是互不相等的 整数。设计一个将所有奇数移动到所有偶数前边的算法(要求时间最少,辅助空间最少)
时间: 2024-10-17 16:07:21 浏览: 41
在C++中,我们可以使用两个指针,一个从头开始扫描顺序表,另一个指向第一个偶数之后的位置。遇到奇数就将其交换到前面,然后继续遍历。直到找到第一个偶数。这个过程可以原地完成,不需要额外的空间。以下是简单的代码实现:
```cpp
#include <iostream>
using namespace std;
void move_odd_to_even(int arr[], int n) {
if (n <= 1) return; // 特殊情况,空表或只有一个元素,无需移动
int odd_index = 0; // 奇数位置的索引
for (int i = 0; i < n; ++i) {
if (arr[i] % 2 == 0) { // 如果偶数
// 将偶数直接放到原位置
if (odd_index != i) {
swap(arr[odd_index], arr[i]);
}
++odd_index; // 奇数索引向前移动
}
}
}
// 测试代码
int main() {
int a[] = {1, 2, 3, 4, 5, 6};
int n = sizeof(a) / sizeof(a[0]);
move_odd_to_even(a, n);
for (int i = 0; i < n; ++i) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
```
这个算法的时间复杂度是O(n),因为我们只遍历了一次整个序列。空间复杂度是O(1),因为我们只需要几个临时变量。
阅读全文