Given an array of positive and negative integers, re-arrange it
so that you have postives on one end and negatives on the other,
BUT retain the original order of appearance.
so that you have postives on one end and negatives on the other,
BUT retain the original order of appearance.
For eg. 1, 7, -5, 9, -12, 15 => -5, -12, 1, 7, 9, 15
可以使用块交换技术实现题目要求,
1,7,-5 交换为 -5,1,7
然后
-5,1,7,9,-12 交换为 -5,-12,1,7,9
目测时间复杂度是o(n^2)
但是可以用递归将时间复杂度降维nlogn
http://haixiaoyang.wordpress.com/?s=Rearrange
有空可以研究下
//Given an array of positive and negative integers,
//re-arrange it so that you have postives on one end
//and negatives on the other, BUT retain the original order of appearance. do it in-place
//e.g. 1, 7, -5, 9, -12, 15 => -5, -12, 1, 7, 9, 15
//When considering optimization from O(n^2) to O(nlogn),use divided & conquer
void swapRange(int a[], int nBeg, int nEnd)
{
assert(a && nBeg <= nEnd);
while (nBeg < nEnd)
swap(a[nBeg++], a[nEnd--]);
}
//solution:
//e.g. in any stage: ---- "+++ --" ++++, reverse middle part
// ==> ---- "--" "+++" ++++, reverse middle 2 parts seperatly to keep "stable"
void ReArrange(int a[], int n)
{
assert(a && n > 0);
if (n <= 1) return;
ReArrange(a, n/2);
ReArrange(a + n/2, n - n/2); //pitfall, notice both parameters
int nLft = 0;
while (a[nLft] < 0)
nLft++;
int nRgt = n-1;
while (a[nRgt] >= 0)
nRgt--;
//Very important, no need to swap under this situation, return
if (nRgt <= nLft) return;
swapRange(a, nLft, nRgt);
int nBegRgt = nLft;
while (a[nBegRgt] < 0) //no need to use "&& nBegRgt < n"
nBegRgt++;
swapRange(a, nLft, nBegRgt-1);
swapRange(a, nBegRgt, nRgt);
}
数组重排算法
本文介绍了一种特殊的数组重排算法,该算法可以在保持原有顺序的前提下,将正数和负数分别集中到数组的一端。通过使用递归和块交换技术,能够有效地降低时间复杂度从O(n^2)至O(nlogn)。
491

被折叠的 条评论
为什么被折叠?



