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