把数组负数移到前面去
时间: 2024-11-29 10:12:14 浏览: 19
将数组中的负数移动到前面,通常可以采用双指针法,同时遍历数组。这里是一个基本的步骤:
1. 定义两个指针,一个 `start` 指向数组的开始,一个 `end` 初始值为 `start + 1`。
2. 当 `end` 小于等于数组长度时,循环执行以下操作:
a. 检查 `arr[start]` 是否是非负数(即大于等于0),如果是非负数,移动 `end` 到下一个位置;
b. 如果 `arr[start]` 是负数,交换 `arr[start]` 和 `arr[end]` 的值,然后 `start++` 和 `end++`。
3. 循环结束后,数组的第一个元素到最后就会是所有的负数,剩下的就是非负数。
以下是这个过程的一个伪代码示例:
```python
def move_negatives_to_front(arr):
start = 0
end = 1
while end < len(arr):
if arr[end] >= 0:
end += 1
else:
arr[start], arr[end] = arr[end], arr[start]
start += 1
end += 1
return arr
```
相关问题
将负数移到正数前面
实现这个功能的方法与将奇数移到偶数前面类似,同样可以使用双指针。一个指向数组的开头,一个指向数组的末尾。从开头开始遍历数组,当遇到正数时停下来,从末尾开始遍历数组,当遇到负数时停下来,然后交换这两个位置上的数值。继续这个过程,直到两个指针相遇为止。这样就能将所有负数移到所有正数前面。
以下是对应的代码实现:
```
void moveNegativeBeforePositive(int arr[], int length) {
int left = 0; // 指向数组开头的指针
int right = length - 1; // 指向数组末尾的指针
while (left < right) {
// 从开头开始遍历数组,找到正数
while (left < right && arr[left] >= 0) {
left++;
}
// 从末尾开始遍历数组,找到负数
while (left < right && arr[right] < 0) {
right--;
}
// 交换负数和正数的位置
if (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
```
可以通过调用 `moveNegativeBeforePositive` 函数来实现将负数移到正数前面。需要注意的是,这个函数只能处理整数数组,对于其他类型的数组需要做相应的修改。
算法设计题:有一个含有2n个整数元素数组a,其中正数和负数恰好都是n个,设计一个高效算法将所有负数移到正数的前面,要求算法的空间复杂度为O(1)。用C语言编写主要算法程序
这是一个经典的双指针问题,可以使用两个指针i和j,一个从数组开始,另一个指向第一个正数。遍历整个数组,如果遇到负数,就交换当前元素和指针j所指向的元素,并将j向后移动一位;如果遇到正数,则不做任何操作。当i到达正数部分时,整个过程结束,因为所有的正数都已经在j的位置之前。
以下是C语言的实现:
```c
#include <stdio.h>
#include <stdbool.h>
bool isNegative(int num) {
return num < 0;
}
void moveNegativesToFront(int a[], int n) {
int i = 0; // 负数指针
int j = 1; // 正数指针
while (i < n && j < n) {
if (isNegative(a[i])) {
// 交换位置
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
} else {
j++; // 遇到正数,跳过
}
}
}
int main() {
int a[] = {-5, 3, -2, 7, -4, 1, -6};
int n = sizeof(a) / sizeof(a[0]);
moveNegativesToFront(a, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
阅读全文