Algorithme pour trouver le plus grand entier dans la gamme
Je suis en train de créer une méthode qui retourne un int - la valeur du plus grand entier dans l'envoyé de tableau.
La façon dont je veux que cette méthode de travail est la vérification de la première et le dernier élément du tableau dans une boucle for, et de travailler leur chemin vers le milieu. J'ai donc = premier entier, k = dernière entier. Lorsque i = 0, k = n-1
(index), lorsque i = 1, k = n-2
si vous attrapez ma dérive. Dans chaque boucle, il est nécessaire de vérifier if a[i]>a[k]
. Puis ils changent de place. Alors je sais que le plus grand nombre est le leader de la moitié de la matrice, et puis je veux vérifier que la moitié, si, finalement, le plus grand int est à l'index 0.
J'ai essayé comme ceci:
public static int maxOfArray(int[] a)
{
int length = a.length;
if(length<1)
throw new NoSuchElementException("Not at least one integer in array");
while (length > 1)
{
int k = length;
for(int i = 0; i < length/2; i++)
{
k--;
if(a[i]<a[k])
{
int j = a[i];
a[i] = a[k];
a[k] = j;
}
}
length /=2;
}
return a[0];
}
..mais je n'ai pas vraiment l'obtenir.. je vais avoir un moment difficile de "s'imaginer" ce qui se passe ici.. Mais il n'est pas toujours de travailler.. (même si parfois).
MODIFIER
Aussi: Le tableau {6,15,2,5,8,14,10,16,11,17,13,7,1,18,3,4,9,12}; va cracher 17 que le plus grand nombre. Je me rends compte que j'ai pour fixer la longueur impaire bug, mais j'aimerais résoudre ce même longueur de la matrice de première..
"[...] Puis ils changent de places" - ressemble à l'OP veut réellement sort le tableau dans certains de tri à bulles style. S'il vous plaît ajouter le quiz de la balise!
Eh bien, oui. C'est pour un petit projet d'école. Je peux voir beaucoup de réponses à d'autres méthodes, mais la demande est de comparer le premier et le dernier, puis changer de place si le dernier est plus grand - puis continuer vers le milieu du tableau. Le plus important est de ne pas être mis à l'index 0, juste placé sur le côté "gauche" de la matrice, donc de le placer sur l'index 0 lorsque vient le temps..
Le plus important serait de ne pas toujours être à la pointe de la moitié. Dites vous tableau est [1, 5, 3], alors vous en premier comparer (1 > 3), (5 > 5) et enfin (3 > 1). Vous avez maintenant [3, 5, 1] et vous diviser la longueur par 2, ce qui vous donne la matrice [3]. Vous avez perdu le 5. Aussi, si vous passez la comparaison que vous n'avez pas de numériser l'ensemble du tableau, mais seulement la moitié. Maintenant vous déplacez d'abord un grand nombre de la moitié du haut, puis vers le bas.
Donc
for(int i = 0; i < length; i++)
est faux, vous avez seulement besoin d'itérer sur la première moitié du tableau: for(int i = 0; i < length / 2; i++)
. Également vérifier ce qui se passe si la taille de la matrice est impair.OriginalL'auteur Sti | 2012-09-11
Vous devez vous connecter pour publier un commentaire.
Un bug lors de la rencontre d'
length
est impair.Dans ces cas, vous "ratez" le milieu de l'élément.
Exemple: pour la saisie
int[] arr = { 8, 1, 5, 4, 9, 4, 3, 7, 2 };
- l'élément9
seront comparés et vérifiées par rapport à lui-même, mais alors vous réduisez la taille delength
, vous exclure9
du tableau vous allez pour l'itération suivante.Je crois qu'il peut être résolu en réduisant le problème à
ceil(length/2)
au lieu delength/2
(et de manutention cas particulier delength==1
)L'autre problème, comme il a été mentionné dans les commentaires est: vous avez besoin de itérer jusqu'à
length/2
plutôt jusqu'àlength
, sinon vous personnalisez vous-même.Enfin - le signe est faux.
devrait être
Rappelez - vous que vous essayez de permuter les éléments, si le premier est plus petit que le deuxième dans l'ordre de pousser les grands éléments de la tête de votre tableau.
Je crois f_puras est également correct dans son commentaire. Vous devriez itérer jusqu'à
length/2
en plus de ce que j'ai mentionné ici.Ici vous allez la condition si le signe est aussi mauvais. Je editted la réponse à la refléter.
Avez-vous résoudre l'étrange tableau de longueur problème? Il peut survenir même pour la même longueur de la matrice, parce que vous êtes constamment diviser le problème (Par exemple longueur=18, la deuxième itération auront longueur=9)
Vous pouvez y remédier en:
length = (int)Math.ceil((double)length/2);
pour la modification delength
.OriginalL'auteur amit
Dans ce cas, vous devez utiliser un débogueur pour parcourir le code, pour obtenir une image de ce que chaque ligne de code ne.
Ce que je voudrais faire est de:
The way I want this method to work, is to....
Ajout d'une solution pour trouver le max à la dure. 😉
OriginalL'auteur Peter Lawrey
C'est plutôt un fou pour résoudre le problème, mais je vais jouer le jeu.
Le problème est dans la boucle interne.
Si vous regardez attentivement, vous remarquerez que si nous avons échangé les éléments dans le premier échange, nous permettra également d'échanger dans le dernier swap; c'est à dire on va ANNULER les effets de la première swap. Et la même chose s'applique par paire, par le biais de l'ensemble de la tranche de tableau.
Voir?
Ce que vous devez faire est d'arrêter la boucle interne de la moitié du chemin ... et puis prendre en compte le cas où
length
est impair.Par ailleurs, la raison, j'ai appelé ce "plutôt fou", parce que l'évidence de façon simple et est beaucoup plus rapide:
O(N)
contreO(NlogN)
i<length/2
, et j'ai aussi réalisé que j'ai fait échangé le plus grand entier de la mauvaise moitié, mais j'ai encore du mal avec certains tableaux. I. e 6,15,2,5,8,14,10,16,11,17,13,7,1,18,3,4,9,12. Je n'ai pas commencé sur la longueur impaire, comme c'est une même longueur qui ne travaillent pas encore..Oui, si vous êtes de brassage des grands nombres à gauche vous avez donné a obtenu le signe de la comparaison à l'envers.
Oui, j'ai remarqué. J'ai mis à jour la question de l'inclure.
Si vous ne pouvez toujours pas à comprendre ce que le problème dans votre code, essayez d'ajouter traceprints ou de son exécution à l'aide d'un débogueur.
En anglais, il est appelé "analyse de la complexité", c'est la "Big O" ou "Landau" notation. Attendre jusqu'à ce qu'ils enseignent, ou de le rechercher sur Wikipédia 🙂
OriginalL'auteur Stephen C
Cela vous donnera Plus grand nombre dans la gamme.
UR DE BIENVENUE
OriginalL'auteur Azuu
Ici est une solution qui s'adapte le cahier des charges que vous voulez (à la différence de beaucoup d'autres ici, humm, humm):
Edit: Ajout de mod, de sorte qu'il fonctionne si le dernier élément est le plus important..
OriginalL'auteur Tobb
Je pense que votre code fonctionne, vous avez juste à ceil la longueur /2 dans le cas de l'étrange tableau, mais mes tests de retour bon résultat:
OriginalL'auteur Vince
Pourquoi ne pas tout simplement mettre la première valeur du tableau à une variable
max
.Après cela, il suffit parcourir le tableau à partir de la deuxième position jusqu'à la dernière ,
dans la boucle, il suffit de vérifier si la valeur actuelle est supérieure à
max
ou pas.Si il est plus juste d'attribuermax
cette valeur.Retour
max
et vous avez le plus grand nombre.The way I want this method to work, is to....
(2) il n'est pas java (Length
champ). C# je soupçonneOk elle n'est pas la réponse OPs question, mais offre une alternative qui fonctionne.Pourquoi pas?
est parfaitement droite, cochez Java les Tableaux pour un exemple.
Il a été
num.Length
quand ce commentaire a été ajouté 😉Oups, je m'en excuse!
OriginalL'auteur Priyank Patel
Que le même u peut approcher comme aussi,
OriginalL'auteur Sivaraman
La meilleure façon est d'utiliser des Tableau qui s'étend de la Liste de la Collection ArrayList
OriginalL'auteur Fatih Şennik