设任意n个整数存放与数组A[1..n]中,试编写C语言算法并实现,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))
时间: 2024-11-16 12:19:57 浏览: 58
C语言入门-leetcode练习之第41题缺失的第一个正数.zip
在C语言中,你可以使用双指针法来实现这个功能,该方法可以在O(n)的时间复杂度内完成。这里是一个简单的实现步骤:
1. 定义两个指针,`i` 和 `j`,分别指向数组的开始(0)和结束(n-1)。
2. 当`i`小于`j`时,继续循环:
a. 如果`A[i]`是非正数(即`A[i] <= 0`),则将`i`向右移动一位,因为已经找到了一个非正数,可以跳过它。
b. 如果`A[j]`是正数(即`A[j] > 0`),则交换`A[i]`和`A[j]`的位置,然后将`j`减一,表示找到一个正数,并将其放在已排序的部分的前面。
3. 当`i`不再小于`j`时,遍历过程结束,数组中的正数已经在前半部分,负数在后半部分。
以下是这个算法的伪代码实现:
```c
void sortPositiveNumbers(int A[], int n) {
int i = 0, j = n - 1;
while (i < j) {
// 如果左指针处元素非正,移到下一个
while (i < j && A[i] <= 0) {
i++;
}
// 如果右指针处元素正,交换并移动右指针
if (i < j) {
swap(A[i], A[j]);
j--;
}
}
}
```
请注意,这里的`swap`函数需要你自己实现,用于交换两个数组元素的值。
阅读全文