在学校OJ上刷到一条关于快速排序的算法题,本以为自己能写出来,但是还有细节没能注意
public static int partition(int[] a, int beg, int end) {
int tmp = a[beg];
int i = beg, j = end;
while (i < j) {
while (i < j && a[j] >= tmp) j--;
while (i < j && a[i] <= tmp) i++;
if (i < j)
swap(a, i, j);
}
swap(a, beg, j);
return j;
}
以上是快速排序的partition的Java版本,采用的是左右指针法,其中注意:
如果选择的是数组最左边的元素为基准数,则必须先动右边的指针;如果选择的是数组最左边的元素为基准数,则必须先动右边的指针
道理应该是最后i和j会停在同一位置,然后和基准数交换,所以这个数必须必比基准数小(因为交换之后这个数在最左边),而如果左边的指针i先动,则最后停下来的时候是停在j所指向的数,而此时j指向的数是比基准数大的,所以不符合要求;所以必须先动j指针