Depois de receber esta pergunta, você primeiro pensará em classificar. Após classificar, selecione o maior número K. Seleção de classificação A classificação rápida é uma escolha melhor.
Ok, vamos fazer a primeira solução: classificação rápida
O código é o seguinte
Copie o código do código da seguinte forma:
public static void quickSort(int[] arr, int início, int fim) {
if (início <fim) {
chave int = arr[iniciar];
int direita = início;
int esquerda = fim;
while (direita <esquerda) {
while (direita < esquerda && arr[esquerda] > tecla) {
esquerda --;
}
if (direita <esquerda) {
arr[direita] = arr[esquerda];
}
while (direita <esquerda && arr[direita] <= tecla) {
certo++;
}
if (direita <esquerda) {
arr[esquerda] = arr[direita];
}
}
arr[direita] = chave;
quickSort(arr, iniciar, direita-1);
quickSort(arr, esquerda+1, fim);
}
}
Após a classificação rápida, o array estará em ordem. A classificação acima é de pequeno a grande, então nossa saída deve ser a seguinte.
Copie o código da seguinte forma: int k = 4;
for (int i=arr.length-1; i>=arr.length-k; i--) {
System.out.println(arr[i]+" ");
}
. A primeira solução já é boa, mas existe maneira melhor?
A resposta é sim! Podemos escolher a classificação parcial e, em seguida, usar a classificação por seleção para resolver esse problema.
O código é o seguinte:
Copie o código da seguinte maneira: public static int[] selectSortK(int[] arr, int k) {
if(arr == nulo || arr.length == 0) {
retornar nulo;
}
int[] novoArr = novo int[k];
List<Integer> list = new ArrayList<Integer>();//Regista o subscrito do número máximo de cada vez
for (int i=0; i<k; i++) {
int maxValue = Integer.MIN_VALUE; //Valor máximo
int maxIndex = i;
for (int j=0; j<arr.length; j++) {
if (arr[j] > maxValue && !list.contains(j) ) {
maxValue = arr[j];
maxIndex = j;
}
}
if (!list.contains(maxIndex)) {//Se não existir, adicione-o
lista.add(maxIndex);
novoArr[i] = valormax;
}
}
retornar novoArr;
}