Cela peut être effectué de manière récursive à l'aide BinarySearch. Ci-dessous est un BinarySearch pour trouver le plus petit. Il peut être étendu pour trouver le plus petit et le second plus petit (méthode semblable au tournoi).
public int findSmallest(int[] A, int start, int end){
if(end == start){
return A[start];
}else if(start == end-1){
return Math.min(A[start], A[end]);
}else{
int mid = start + (end-start)/2;
int min1 = findSmallest(A, start, mid);
int min2 = findSmallest(A, mid+1, end);
return Math.min(min1, min2);
}
}
Voici la méthode pour trouver Deuxième plus petit. L'idée de base est de renvoyer le maximum lorsque la taille de la recherche est <=2
. Pour le reste de la recherche, retournez min.
public static int findSecondSmallest(int[] A, int start, int end){
if(end == start){
return A[start];
}else if(start == end-1){
return Math.max(A[start], A[end]);
}else{
int mid = start + (end-start)/2;
int min1 = findSecondSmallest(A, start, mid);
int min2 = findSecondSmallest(A, mid+1, end);
return Math.min(min1, min2);
}
}
Je l'aurais upvoted si vous n'aviez pas posté ce commentaire "Je suis pressé" en réponse à la réponse de Josh. – finnw
-1 pour "être pressé" qu'est-ce que c'est, même? – bevacqua