算法设计题:有一个含有2n个整数元素数组a,其中正数和负数恰好都是n个,设计一个高效算法将所有负数移到正数的前面,要求算法的空间复杂度为O(1)。用C语言编写主要算法程序
时间: 2024-10-25 16:12:11 浏览: 22
基础电子中的计算机算法之定点数
这是一个经典的双指针问题,可以使用两个指针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;
}
阅读全文