设任意n个整数存放于数组A(1:n)中,试编写算法,将所有正数排在所有负数前面(要求算法复杂度为0(n))和思路用 c 语言。
时间: 2024-11-10 14:26:06 浏览: 46
要在C语言中实现一个时间复杂度为O(n)的算法,将数组A中的所有正数放在所有负数前面,我们可以采用“双指针”策略。这个算法的基本思想是同时遍历数组的两端,当遇到第一个负数时,将其与右侧的第一个正数交换;反之亦然。这样,每个元素只移动一次,整个过程完成一次正负数的分界。
以下是详细的C语言代码实现:
```c
#include <stdio.h>
void separatePositiveNegative(int A[], int n) {
int left = 0; // 左指针,初始值为0,指向数组开始
int right = n - 1; // 右指针,初始值为数组最后一个元素
while (left < right) {
// 当左指针处元素大于等于0,右指针处小于0时交换
if (A[left] >= 0 && A[right] < 0) {
int temp = A[left];
A[left] = A[right];
A[right] = temp;
left++;
right--;
}
// 否则,分别向中间移动左右指针
else if (A[left] < 0) {
left++; // 左指针向右移动到下一个正数或边界
} else {
right--; // 右指针向左移动到下一个负数或边界
}
}
}
int main() {
int A[] = {5, -3, 7, -2, 4, -6};
int n = sizeof(A) / sizeof(A[0]);
printf("原始数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", A[i]);
}
separatePositiveNegative(A, n);
printf("\n调整后数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", A[i]);
}
return 0;
}
```
运行这段代码,将会得到所有正数在前、负数在后的结果。
阅读全文