📅  最后修改于: 2023-12-03 15:29:44.972000             🧑  作者: Mango
在开发过程中,我们经常需要对数组进行操作。有时候,我们需要将数组中的正数和负数分别排在前后,并保持它们的相对顺序。本文将介绍如何使用 C 语言在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数。
我们可以使用双指针算法来实现这个操作。我们可以让前面的指针指向第一个正数,后面的指针指向第一个负数。然后交换两个指针指向的数,直到两个指针相遇为止。
具体实现如下:
void rearrange(int arr[], int n) {
int i = 0, j = n - 1;
while (i < j) {
while (arr[i] > 0) {
i++;
}
while (arr[j] < 0) {
j--;
}
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
这个算法的时间复杂度为 O(n),因为我们只需要遍历一次数组。而且,我们只使用了两个指针,所以空间复杂度为 O(1)。
我们来看一个示例:
#include <stdio.h>
void rearrange(int arr[], int n);
int main() {
int arr[] = {-1, 2, -3, 4, 5, 6, -7, 8, 9};
int n = sizeof(arr) / sizeof(arr[0]);
rearrange(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
void rearrange(int arr[], int n) {
int i = 0, j = n - 1;
while (i < j) {
while (arr[i] > 0) {
i++;
}
while (arr[j] < 0) {
j--;
}
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
上述示例中,我们将数组中的正数和负数分别排在了前后。输出结果如下:
-1 -3 -7 4 5 6 2 8 9
在本文中,我们介绍了如何使用 C 语言在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数。我们使用了双指针算法,这个算法可以快速有效地处理这个问题。如果读者对这个算法感兴趣,可以进一步了解双指针算法的其他应用。