Объясните пожалуйста, по какой причине если возвращать j, у левого предела как и у правого не учитывать опорный элемент и сортировать их, то выходит неправильная сортировка, если же вместо j возвращать i, QSort(arr, low, pivotindex - 1); QSort(arr, pivotindex, high); и записывать сортировку левой и правой части так, то всё сортирует прекрасно, в чём проблема совсем не могу понять, объясните пожалуйста ! (Что не так с этой j, как это понять и додуматься, что нужно i)
import java.util.Arrays;

public class QuickSort {
    public static void swap(int[] arr, int pos1, int pos2) {
        int temp = arr[pos1];
        arr[pos1] = arr[pos2];
        arr[pos2] = temp;
    }

    public static int DaC(int[] arr, int low, int high) {
        int pivot = arr[low + (high - low) / 2];
        int i = low;
        int j = high;
        while (i <= j) {
            while (arr[i] < pivot) {
                i++;
            }
            while (arr[j] > pivot) {
                j--;
            }
            if (i <= j) {
                swap(arr, i, j);
                i++;
                j--;
            }
        }
        return j;
    }

    public static void QSort(int[] arr, int low, int high) {
        if (low < high) {
            int pivotIndex = DaC(arr, low, high);
            QSort(arr, low, pivotIndex - 1);
            QSort(arr, pivotIndex + 1  , high);
        }
    }

    public static void main(String[] args) {
        int[] a = {10, 5, 3, 8, 6, 2, 7, 14, 9};
        int size = a.length;
        QSort(a, 0, size - 1);
        System.out.println(Arrays.toString(a));
    }
}