📌  相关文章
📜  C 程序在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数(1)

📅  最后修改于: 2023-12-03 15:29:44.972000             🧑  作者: Mango

C 程序在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数

在开发过程中,我们经常需要对数组进行操作。有时候,我们需要将数组中的正数和负数分别排在前后,并保持它们的相对顺序。本文将介绍如何使用 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) 额外空间内重新排列正数和负数。我们使用了双指针算法,这个算法可以快速有效地处理这个问题。如果读者对这个算法感兴趣,可以进一步了解双指针算法的其他应用。