J'essaie d'implémenter le pseudo-code suivant. Je dois le faire en utilisant uniquement des partitions logiques.Recherche du kième élément le plus petit dans un tableau non trié
Procedure SELECT(k,S)
{ if |S| =1 then return the single element in S
else { choose an element a randomly from S;
let S1,S2,and S3 be he sequences of elements in S
less than, equal to, and greater than m, respectively;
if |S1| >=k then return SELECT(k,S1)
else
if (|S1| + |S2| >=k then return m
else return SELECT(k-|S1|-|S2| , S3);
}
}
Voici ma tentative jusqu'à présent:
public static int select(int k, int[] s, int arrayLeft, int arrayRight) {
if (s.length == 1) {
return s[0];
} else {
Random rand = new Random();
int right = rand.nextInt(arrayRight) + arrayLeft;
int m = s[right];
int pivot = partition(s, arrayLeft, right); // pivot = |s1|
if (pivot >= k) {
return select(k, s, arrayLeft, pivot - 1);
} else {
// Calculate |s2|
int s2Length = 0;
for (int i = pivot; s[i] == m; i++) {
s2Length++;
}
if (pivot + s2Length >= k) {
return m;
} else {
int s3Left = pivot + s2Length;
return select(k - pivot - s2Length, s, s3Left + 1, s.length);
}
}
}
}
// all elements smaller than m are to the left of it,
// all elements greater than m are to the right of it
private static int partition(int[] s, int left, int right) {
int m = s[right];
int i = left;
for (int j = left; j <= right - 1; j++) {
if (s[j] <= m) {
swap(s, i, j);
i++;
}
}
swap(s, i, right);
return i;
}
private static void swap(int[] s, int i, int j) {
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
Ma méthode select
ne renvoie pas les réelles kième plus petit élément. La méthode de partition ne fait que son travail correctement sur les éléments plus petits que m. Sur la partie du tableau à droite de m, il y a des éléments de n'importe quelle valeur. Comment puis-je réparer ça? Toutes les solutions que j'ai vues en ligne ressemblent à ma méthode. Toute aide est appréciée!
Je suis confus. Où est-ce que le pseudo-code dit quelque chose sur le réordonnancement du tableau? Parce que si vous allez réordonner de toute façon, vous pouvez simplement utiliser un algorithme de tri et retourner le kième élément du tableau après ... – Mark
L'algorithme est censé être plus rapide qu'un tri complet. Vous devez représenter S1, S2 et S3 d'une manière ou d'une autre, le faire en réordonnant le tableau n'est pas la chose la plus stupide à faire. –
Vous devez apprendre à utiliser un débogueur. –