关于快速排序!解决办法

关于快速排序!!!
下面是快速排序的一段C语言描述,快速排序的算法是对于一个给定的数组,从中选择一个元素,已该元素为界将其余元素划分为两个子集,一个子集中的所有元素都小于该元素,另一个子集中的所有元素都大于或等于该元素,对这两个子集递归执行这一过程,当某个子集中的元素小于2时,这个子集就不需要再次排序,终止递归。
void swap(int v[],int i,int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}

void qsort(int v[],int left,int right)
{
int i,last;
if(left>=right)
return;
swap(v,left,(left+right)/2);
last = left;
for(i=last+1;i<=right;i++)
if(v[i]<v[left])
swap(v,++last,i);
swap(v,left,last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}

可惜我看不懂,上面这段代码,而且奇怪的事,把swap(v,++last,i);改成swap(v,last++,i);后就不对了,这是怎么回事,能帮我详细解释下上面的代码么?

------解决方案--------------------
<<把swap(v,++last,i);改成swap(v,last++,i);后就不对了
改了之后,肯定不对。因为last指向你所说的“一个子集中的所有元素都小于该元素“子集的最后的一个元素。这是只有先++last才可以将i位置的元素与另一个子集(所有元素都大于或等于该元素)交换。不知道我表达清楚了没有。据个例子:
排序过程中的某一时刻数组的状态为:
4 1 2 3 5 8 4 1 0 
left指向下标0,last指向下标3,i指向下标7
那么,执行了swap(v,++last,i);之后,为
4 1 2 3 1 8 4 5 0
再不明白,如LS所说,用一个简单例子画画。