随机生成100个-1000到1000的随机整数,按照生成的顺序放在数组A[1,..100]中,把所有的正数排在所有负数前面,要求算法复杂度为O(n)。
时间: 2024-12-17 20:51:13 浏览: 3
测试中的随机性
要实现这个需求,你可以使用一个简单的遍历过程,同时维护两个指针,一个用于存储当前插入的位置(假设为`i`),另一个用于找到下一个正数的位置(假设为`j`)。遍历过程中,当遇到正数时,将其直接添加到已排序的部分末尾,然后更新`i`;遇到负数时,则将其添加到`i`之后。这种方法的时间复杂度确实是O(n),因为我们只遍历了一次数组。
以下是一个C++代码示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> separatePositiveAndNegative(int limit) {
std::vector<int> A(limit * 2);
// 随机填充数组
for (int i = 0; i < limit * 2; ++i) {
A[i] = rand() % (limit * 2) - limit; // 使用rand()函数生成-1000到1000的随机整数
}
int i = 0, j = 0;
for (int num : A) {
if (num >= 0) { // 正数
A[j++] = num;
} else { // 负数
while (i < j && A[i] >= 0) ++i;
A[i++] = num;
}
}
return A;
}
int main() {
const int limit = 50; // 可根据需要调整大小
std::vector<int> result = separatePositiveAndNegative(limit);
// 输出结果
for (int num : result) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
```
在这个代码中,我们首先创建了一个足够大的数组`A`来存放随机数。然后通过两个指针`i`和`j`进行遍历。遍历时,如果元素是正数,我们就把它放到`j`位置(因为`j`始终指向正数的最后一个位置)并递增`j`;如果是负数,就寻找一个大于或等于零的位置插入,然后递增`i`。
阅读全文