【编程之法】2.6 不改变正负数相对顺序的重新排列

来源:互联网 发布:淘宝用了优惠券退款吗 编辑:程序博客网 时间:2024/04/30 00:29

题目描述
给定一个未排序的整数数组,数组中的元素有正数也有负数,要求对数组中的元素进行重新排列,使得负数排在正数的前面,并且不改变原来正数和负数之间的相对顺序。例如,如果输入是{1,7,-5,9,-12,15},则输出是{-5,-12,1,7,9,15}。要求时间复杂度为O (n),空间复杂度为O(1)

思路描述
由于不改变相对顺序,可以参考之前字符串中字符移动的代码,具体实现如下:

/**    这种算法的空间复杂度O(1) ,但是时间复杂度为O(2n)*/#include<iostream>#include<cstdio>using namespace std;const int maxn = 100;int num[maxn];int main(){    int n;    cin >> n;    for(int i = 0; i < n; ++i)    {        cin >> num[i];    }    // begin    int i = n-1;    int j = n-1;    int tmp;    while(true)    {        while(i >= 0 && num[i] > 0)        {            --i;        }        if(i < 0)        {            break;        }        while(j >= 0 && (j >= i || num[j] < 0))        {            // 通过 j >= i 实现 用 j 找到 i 之前最近的正数            --j;        }        if(j < 0)        {            break;        }        tmp = num[i];        num[i] = num[j];        num[j] = tmp;    }    // end    for(int i = 0; i < n; ++i)    {        cout << num[i] << " ";    }    return 0;}

运行结果
这里写图片描述

我阅读了”Stable Minimum Space Partitioning in Linear Time”
但是其中的一些地方还是不太清楚,希望大家能够帮忙解决。

1 0
原创粉丝点击