设任意n个整数存放与数组A[1…n]中,试编写C语言算法并实现,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))输出完整代码
时间: 2024-11-15 11:24:42 浏览: 101
为了实现这个任务,你可以使用双指针法,一个指向正数区间的开始,另一个指向当前未排序部分的开始。以下是完整的C语言代码示例:
```c
#include <stdio.h>
void separatePositiveNegative(int A[], int n) {
// 初始化两个指针:i 指向第一个元素,j 指向第一个未检查的正数位置
int i = 0;
int j = 1;
while (i < n && j < n) {
// 如果j位置的数是正数,且已经越过了所有的负数
if (A[j] >= 0) {
// 将正数移到已排序的部分
for (int k = j; k > i; k--) {
A[k] = A[k - 1];
}
A[i] = A[j]; // 正数插入到正确的位置
i++; // 移动正数指针
} else { // 如果j位置的数是负数,直接跳过它
j++;
}
}
// 打印结果
for (int k = 0; k < n; k++) {
printf("%d ", A[k]);
}
}
int main() {
int size;
printf("请输入数组的长度: ");
scanf("%d", &size);
int A[size];
printf("请输入%d个整数:\n", size);
for (int i = 0; i < size; i++) {
scanf("%d", &A[i]);
}
separatePositiveNegative(A, size);
return 0;
}
```
这个算法的时间复杂度确实是O(n),因为它只遍历了一次数组。注意,在实际运行过程中,正数移动了`i`位置,总共移动了最多`n`次,所以总的操作次数不会超过`n`。
阅读全文