设任意n个整数存放于数组A[1…n]中,试设计算法,将所有正数排在所有负数前面(要求: 算法时间复杂度为0(n))。用C语言写完整的程序
时间: 2024-11-04 08:12:01 浏览: 41
数据结构(JAVA)求一个含有n个整数元素的数组a0..n-1中的最大元素
这个问题可以使用双指针法解决,即分别维护两个指针,一个指向当前查找位置的开始(通常是数组的第一个元素),另一个指向最后一个检查的位置。我们遍历数组,当遇到正数时,就把它移动到开始部分;当遇到负数时,不做调整。这个过程会一直持续到两个指针相遇,或者找到所有的正数。
以下是C语言的一个简单示例:
```c
#include <stdio.h>
void separate_positive_negative(int A[], int n) {
if (n <= 0) return; // 如果数组为空或长度为0,直接返回
int i = 0, j = n - 1;
while (i < j) { // 双指针法
if (A[i] > 0 && A[j] < 0) { // 同时满足条件交换
int temp = A[i];
A[i] = A[j];
A[j] = temp;
i++; j--;
} else if (A[i] >= 0) { // 遇到正数
i++;
} else { // 遇到负数
j--;
}
}
}
int main() {
int A[] = {5, -3, 7, -2, 0, -8};
int n = sizeof(A) / sizeof(A[0]);
printf("Original array:\t");
for (int i = 0; i < n; i++) {
printf("%d ", A[i]);
}
separate_positive_negative(A, n);
printf("\nAfter separation:\t");
for (int i = 0; i < n; i++) {
printf("%d ", A[i]);
}
return 0;
}
```
运行这个程序,它会将正数移到数组的前半部分,负数移到后半部分,同时保持0值不变。整个过程的时间复杂度为O(n),因为我们只遍历了一次数组。
阅读全文