void qsort(int left,int right,int sz[]){
if (left >= right){
return ;
}
int j = right;
int i = left;
int q = left;
while (j > i)
{
while ( sz[j] <= sz[q] && j > i) // 注意q=right,那么sz[j]不可出现=
{
j--;
}
while ( sz[i] > sz[q] && j > i)// 注意q=left,如果用>=,那么sz[i]等于sz[q]就会被丢进另外一半中,导致错误
{
i++;
}
if(j>i){
swap(sz[i],sz[j]);
}
}
swap(sz[j],sz[q]);
qsort(j+1,right,sz);
qsort(left,j-1,sz);
}
优化1, q = sz[(left+right)/2], 这种情况 要同时使用>= 和 <=。因为最坏情况不就是交换了相等的2个数对吧?
void qsort(int left,int right,int sz[]){
if (left >= right){
return ;
}
int j = right;
int i = left;
int q = sz[(left+right)/2];
while (j > i)
{
while ( sz[j] <= q && j > i)
{
j--;
}
while ( sz[i] >= q && j > i)
{
i++;
}
if(j>i){
swap(sz[i],sz[j]);
}
}
swap(sz[j],q);
qsort(j+1,right,sz);
qsort(left,j-1,sz);
}
优化3, q使用随机数 待补充