//p,r分别是这个要排序的区段的下标
int partion(int *arElem, int p, int r)
{
int x = arElem[r];
int i = p,j = p;
for(; i < r; i++)
{
if(arElem[i] < x)
{
if(i != j)
{
exchange(arElem, i, j);
}
j++;
}
}
exchange(arElem, j, r);
return j;
}
这里主要思想是将这个区间最后一位作为参照数,将比这个数小的数放到左边,比这个数大的数放到右边
i和j分别代表什么:
i是遍历数组用的,指向当前遍历到的数,j总是期望是指向比参照数大的数。
因为只要当前遍历到的数比参照数小,i和j都是同步增长的
当前数如果比参照数大(或等于),那么j就不动了,所以说j期望指向比参照数大的数
在j已经指向比参照数大的数这种情况下,如果当前数比参照数小,那么就会将i和j所指的数交换,并且i和j都向右移动一位。这时候,j肯定是指向比参照数大的数的(自己分析)。
即,如果数组中间有比参照数大的数,j会一直指向比参照数大的数;如果数组中间没有比参照数大的数,j会指向最后的参照数。
所以最后将参照数和j交换就很容易理解了。