我觉得改成i>=j会有问题,比如当i和j刚好同时指向同一个元素时就break掉的话,其实并不确定这个元素与标定点v的大小关系吧?然而在外层函数还有一个操作swap(arr[l],arr[j]),即默认j最后指定的数归为<=v那一类。但是,我测试了下改成i>=j确实没有报错,没想通。。。
int __partition2(T arr[], int l, int r){
swap(arr[l], arr[rand()%(r-l+1)+l]);
T v = arr[l];
//arr[l+1...i)<=v;arr(j...r]>=v; make balance!
int i = l+1,j=r;
while(true){
while(i<=j && arr[i]<v)
i++;
while(j>=i && arr[j]>v)
j--;
if(i>j)
break;
swap(arr[i],arr[j]);
i++;
j--;
}
swap(arr[l],arr[j]);
return j;
}