Was ist der Zweck dieser Swap-Code-Zeilen in der Quicksort-Anwendung?

Ich versuche, eine Implementierung oder eine Anwendung von QuickSort zu verstehen, um das kleinste k-Element zu finden. Hier ist der Code, den ich zu verstehen versuche.

public int quicksort(int a[], int start, int end, int k) {
    if(start < end) {
        int pivot = partition(a, start, end);
        if(pivot == k -1) {
            return pivot;
        } else if(pivot > k - 1){
            return quicksort(a, start, pivot, k);
        } else {
            return quicksort(a, pivot + 1, end, k);
        }
    } else if(start == end) {
        return k==1?start:-1;
    } else {
        return -1;
    }
}
public int partition(int a[], int start, int end) {
    int pivot = start;
    int i = pivot + 1;
    int j = end;
    while(a[i] < a[pivot] && i < end) {
        i ++;
    } 
    while(a[j] > a[pivot] && j >= 0) {
        j --;
    } 
    if(i < j) {
        swap(a, start, end);
    }
    swap(a,j, pivot);
    return pivot;
}
private void swap(int a[], int swap1, int swap2) {
    int temp = a[swap1];
    a[swap1] = a[swap2];
    a[swap2] = temp;
}

Ich verstehe, dass Sie für den Versuch, das kleinste k-Element zu finden, Quicksort verwenden möchten, da Elemente links vom Pivot kleiner als der Pivot und Elemente rechts vom Pivot größer als sind. Wenn Sie also versuchen, das viertkleinste Element zu finden und der Drehpunkt auf Index 3 steht, können Sie es einfach zurückgeben, da Sie wissen, dass es das viertkleinste ist, da es drei kleinere Elemente gibt.

Ich habe Probleme, die beiden Auslagerungsoptionen in der Partitionsmethode zu verstehen.

m Ende der ersten while-Schleife befindet sich der Index i an einer Position, an der sich alle Elemente, die kleiner als der Drehpunkt sind, links von i befinden. Der Index j befindet sich an einer Position, an der sich alle Elemente, die größer als der Drehpunkt sind, rechts von j befinden.

Was ist der Zweck dieses Swap-Codes in der Partition? Kann jemand ein Beispiel geben, warum dieser Code notwendig ist? Wie werden sich diese jemals treffen?

if(i < j) {
        swap(a, i, j);
}

Und auch für diese Swap-Zeile (auch innerhalb der Partition), warum hat der Autor Pivot und J vertauscht und nicht Pivot und I? Ist es willkürlich?

        swap(a,j, pivot);