Rearrange an array of positive and negative integers

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. 

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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值