Как решить проблему переполнения стека в алгоритме быстрой сортировки?

При запуске программа выдает ошибку переполнения стека. Метод разделения (part), судя по тестам, реализован правильно.

public class Main {
  
  public static void sort(int[] array) {
    qsort(array, 0, array.length - 1);
  }
  
  public static void qsort(int[] array, int li, int ri) {
    int dif = ri - li;
    if (dif < 1)
      return;
  
    int mid = (ri + li) / 2;
    int p = part(array, li, ri, mid);
    qsort(array, li, p - 1);
    qsort(array, p + 1, ri);
  }
  
  public static int part(int[] array, int li, int ri, int index) {
    swap(array, index, array.length - 1);
    index = ri - li;
    int j = 0;
    for (int i = li; i < ri; i++)
      if (array[index] > array[i])
        swap(array, j++, i);
    swap(array, j, index);
    return j;
  }
  
  public static void swap(int[] array, int i1, int i2) {
    int temp = array[i1];
    array[i1] = array[i2];
    array[i2] = temp;
  }
  
  public static void main(String[] args) {
    int[] arr = new int[] {5, 1, 8, 4, 6, 7, 3, 2, 2, 2};
    sort(arr);
    
    for (int i = 0; i < arr.length; i++)
      System.out.println(arr[i]);
  }
}

Ответы (0 шт):