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