Qual é o objetivo dessas linhas de código de swap no aplicativo quicksort?

Estou tentando entender uma implementação ou uma aplicação do quicksort para encontrar o kth menor elemento Aqui está o código que estou tentando entender

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;
}

Entendo que, ao tentar encontrar o k-é o menor elemento, você deseja usar o quicksort porque os elementos à esquerda do pivô serão menores que o pivô e os elementos à direita do pivô serão maiores que. Dessa forma, se você estiver tentando encontrar o quarto elemento menor e o pivô estiver no índice 3, basta devolvê-lo, porque sabe que é o quarto menor, já que existem 3 elementos menores que ele.

Estou tendo problemas para entender os dois swaps no método de partição.

Na conclusão do primeiro loop while, o índice i estará em uma posição na qual todos os elementos abaixo do pivô estarão à esquerda de i. O índice j estará em uma posição na qual todos os elementos maiores que o pivô estarão à direita de j.

Qual é o objetivo desse código de troca dentro da partição? Alguém pode dar um exemplo de por que isso é necessário? Como eles se encontrarão?

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

E também para essa linha de troca (também dentro da partição), por que o autor trocou pivot ej, e não pivot e i? Isso é arbitrário?

        swap(a,j, pivot);

questionAnswers(1)

yourAnswerToTheQuestion