Сравнение во втором внутреннем цикле использует A [i] для сравнения, когда оно должно использовать A [j]:
} while ((A[j].compareTo(pivot)) > 0 && (j > low)); // A[j] not A[i]
Альтернативный вариант для этого типа быстрой сортировкине меняет шарнир на A [high], и, оставляя шарнир в середине, код не должен будет проверять наличие j> low во втором внутреннем цикле, который немного быстрее.Использование этого варианта требует других изменений: от init j до high + 1, и два рекурсивных вызова должны быть быстрой сортировкой (A, low, j) и быстрой сортировкой (A, j + 1, high).Обратите внимание, что значения, равные Pivot, включая саму Pivot, могут оказаться в любом из разделов, поскольку значения, равные Pivot, меняются местами.
Пример кода для примитивов (int), который использует рекурсию для меньшей или равной части, а затем выполняет итерацию назад для большей части, чтобы избежать переполнения стека в худшем случае.Может быть преобразован для использования универсального объекта E.
public static void qsort(int[] a, int lo, int hi)
{
while(lo < hi){
int md = lo+(hi-lo)/2;
int ll = lo-1;
int hh = hi+1;
int p = a[md];
int t;
while(true){
while(a[++ll] < p);
while(a[--hh] > p);
if(ll >= hh)
break;
t = a[ll];
a[ll] = a[hh];
a[hh] = t;
}
ll = hh++;
if((ll - lo) <= (hi - hh)){
qsort(a, lo, ll);
lo = hh;
} else {
qsort(a, hh, hi);
hi = ll;
}
}
}