void swap(int &A, int &B)
{
int tmp = A;
A = B;
B = tmp;
}
void rangeArray(int *Array, int len)
{
int low = 0;
int hight = len-1;
int zero = 0;
//思想是进行两次快速排序
while(low < hight)
{
while (Array[low] <= 0) low++;
while (Array[hight] > 0) hight--;
if (low < hight)
{
swap(Array[low], Array[hight]);
}
}
low = 0;
zero = hight;
while(low < zero)
{
while (Array[low] < 0) low++;
while (Array[zero] == 0) zero--;
if (low < zero)
{
swap(Array[low], Array[zero]);
}
}
}
void rangeArray2(int *arr, int len)
{
// cur 为当前比较的数字
// rightBorderNegative
// leftBorderPositive
// 算法
int rightBorderNegative=0,cur=0,leftBorderPositive=len-1;
//思想: 若arr[cur]大于0,扔到leftBorderPositive后面; 若arr[cur]小于0,扔到rightBorderNegative前面
while(mid <= high)
{
if (arr[cur]<0)
swap(arr[rightBorderNegative++],arr[cur++]); //当前比较的数字若小于0,就会被和low置换,就是说low之前的数字都小于0
else if(arr[cur]==0)
cur++;
else
swap(arr[cur], arr[leftBorderPositive--]); //当前比较的数字若大于0,就会被和hight置换,就是活hight之后的数字都大于0
}
}
对于rangeArray2的解题细想,可以延伸 比某个数小的数都在 low之前;比某个数大的数都在 hight 之后;