数组调整

本文探讨两种数组调整方法。一种是将负数排在零之前,零排在负数之前,可以使用快速排序的Partition方法或三指针法。另一种方法是保持负数和正数原有顺序,将负数移到前面,正数移到后面,可通过辅助数组和二分搜索法实现。
摘要由CSDN通过智能技术生成

1、一个整数数组存在若干的正数、负数和零,如何调整使负数排在零的前边,零排在负数的前边。

很容易想到使用快速排序的Partition方法,选择0作为基准,先将非负数调整到左边,正数调整到右边,然后对于非负数在进行一次调整。

void ArrayArrange(int* pData, int len){
	assert(pData!=NULL);
	int positiveIndex = 0;
	int nonpositiveIndex = 0;
	while (positiveIndex < len){
		if (pData[positiveIndex]<=0){
			if (positiveIndex!=nonpositiveIndex){
				pData[positiveIndex] ^= pData[nonpositiveIndex];
				pData[nonpositiveIndex] ^= pData[positiveIndex];
				pData[positiveIndex] ^= pData[nonpositiveIndex];
			}
			nonpositiveIndex++;
		}
		positiveIndex++;
	}
	int zeroIndex = 0;
	int nevigateIndex = 0;
	while (zeroIndex < nonpositiveIndex){
		if (pData[zeroIndex] < 0){
			if (zeroIndex!=nevigateIndex){
				pData[nevigateIndex] = pData[zeroIndex];
				pData[zeroIndex] = 0;
			}
			nevigateIndex++;
		}
		zeroIndex++;
	}
}

另法:使用三个index,positiveIndex指示下一个正数位置,zeroIndex指示下一个0位置,negitiveIndex指示下一个负数位置,然后只需扫描一遍数组。

void ArrayArrange(int*pData, int len){
	assert(pData!=NULL);
	int positiveIndex = 0;
	int zeroIndex = 0;
	int negitiveIndex = 0;
	while (positiveIndex < len){
		if (pData[positiveIndex]==0){
			if (zeroIndex != positiveIndex){
				pData[positiveIndex] = pData[zeroIndex];
				pData[zeroIndex] = 0;
			}
			zeroIndex++;
		} else if (pData[positiveIndex]<0){
			if (negitiveIndex!=positiveIndex){
				int tmp = pData[negitiveIndex];
				pData[negitiveIndex] = pData[positiveIndex];
				if (tmp == 0){
					if (zeroIndex != positiveIndex){
						pData[positiveIndex] = pData[zeroIndex];
					}
					pData[zeroIndex] = 0;
				} else {
					pData[positiveIndex] = tmp;
				}
			}
			zeroIndex++;
			negiti
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值