用c++完成本题:一个非零数列中有些为正数,有些为负数。试编写一个算法,重新排列这些非零实 数,使得负数排在前面,正数排在后面 提示:参考快速排序的分割算法。
时间: 2023-12-10 08:41:58 浏览: 105
下面是使用快速排序的分割算法实现的代码:
```
#include <iostream>
#include <vector>
using namespace std;
void partition(vector<int>& nums, int left, int right) {
if (left >= right) return;
int i = left, j = right, pivot = nums[left];
while (i < j) {
while (i < j && nums[j] >= pivot) j--;
nums[i] = nums[j];
while (i < j && nums[i] < pivot) i++;
nums[j] = nums[i];
}
nums[i] = pivot;
partition(nums, left, i - 1);
partition(nums, i + 1, right);
}
void rearrange(vector<int>& nums) {
partition(nums, 0, nums.size() - 1);
}
int main() {
vector<int> nums = {3, -1, 2, 0, -5, 8, -2, 7};
rearrange(nums);
for (int num : nums) cout << num << " ";
return 0;
}
```
我们使用 `partition` 函数来分割数组,将负数放在左边,将正数放在右边。在这个函数中,我们使用双指针的方式来扫描数组,一次将一个元素交换到正确的位置。最后,我们将数组分成两部分并递归地调用 `partition` 函数来对它们进行排序。最后,我们可以使用 `rearrange` 函数来调用 `partition` 函数并对数组进行重新排序。
输出结果为:
```
-1 -5 -2 0 2 8 3 7
```
可以看到,负数排在前面,正数排在后面,符合题目要求。
阅读全文