C'est un tableau d'entiers. Il a été créé comme suit: Aucun élément n'est répété. Chaque fois qu'un élément est ajouté, son numéro est l'entier disponible suivant, à partir de 0. De cette façon, si vous ajoutez 6 éléments dans une rangée, ils seront 0, 1, 2, 3, 4, 5, dans cet ordre. Si vous supprimez un élément, le tableau rétrécit et un 'trou' est laissé entre deux des éléments, ils ne sont plus consécutifs à cause de cet écart: 0, 1, 3, 4, 5. Puis vient le problème: si vous ajouter un nouvel élément, il est ajouté à la fin, mais a le prochain entier disponible. Donc, le tableau est maintenant 0, 1, 3, 4, 5, 2. Il doit être trié, donc le 2 peut occuper sa place entre le 1 et le 3. Quelle est la meilleure façon de le faire? J'ai pensé à plusieurs méthodes. La liste est presque ordonnée, et elle a la propriété que, quand elle est ordonnée, chaque élément est égal ou supérieur à son index dans le tableau. Je fais actuellement un tri à bulles (ne rigole pas), je pense que le tri rapide est trop rapide, je ne veux pas aller récursif ou utiliser des tableaux temporaires, et je ne veux pas changer la méthode add-element (qui ajoute l'élément à la fin), il doit donc être trié immédiatement après l'ajout d'un élément (donc seul le dernier élément est déplacé)En java, quelle est la meilleure façon de trier un tableau d'entiers si seul le dernier élément est déplacé?
Répondre
Prenez le dernier élément et effectuez un insertion sort.
Qu'en est-il de l'utilisation d'un java.util.BitSet
à la place? Vous obtiendrez l'insertion et la suppression à temps constant (trouver la première place libre prendra quand même O (n)). Et avec nextSetBit, vous pouvez parcourir l'ensemble dans l'ordre croissant. Avec nextClearBir(), trouver le premier index inutilisé devient aussi trivial.
Peut-être que vous devriez regarder l'idée de Insertion Sort.
Vous n'avez pas besoin de trier la liste, il suffit d'insérer le dernier élément dans l'ordre:
int pos = array.length - 1:
while (pos > 0 && array[pos] < array[pos - 1]) {
tmp = array[pos - 1];
array[pos - 1] = array[pos];
array[pos] = tmp;
pos--;
}
//based on gpeche's code
int pos = array.length - 1;
int val = array[pos];
while (pos > 0 && array[pos-1] > val) {
array[pos] = array[pos - 1];
pos--;
}
array[pos] = val;
Êtes-vous contraint d'utiliser un tableau? Si ce n'est pas le cas, utilisez simplement un TreeSet. Pourquoi écrire votre propre algorithme de tri lorsque vous pouvez utiliser des bibliothèques standard qui exécutent déjà cette fonction? Il a garanti O (log (n)) temps pour les insertions.
import java.util.TreeSet;
TreeSet<Integer> sortedSet = new TreeSet<Integer>();
// Add integers as needed
sortedSet.add(someInt);
// If you need an array at the end
Integer[] array = sortedSet.toArray(new Integer[sortedSet.size()]);
En fait, il a garanti * O (log n) * temps pour les insertions (copier l'ensemble complet dans un tableau prendra bien sûr O (n)) – meriton
Oups, merci meriton. J'ai corrigé la réponse. – wolfcastle
merci, mais pour l'école, je suis obligé de coder mes propres routines de tri, mais cela semble sehr cool! –
- 1. Quelle est la meilleure façon de trier par date?
- 2. Quelle est la meilleure façon de détecter si un objet Javascript donné est un élément DOM?
- 3. Quelle est la meilleure façon d'obtenir le dernier identifiant inséré en utilisant sqlite de Java?
- 4. Quelle est la meilleure façon de combiner plusieurs tableaux en un seul tableau?
- 5. MVC2 Quelle est la meilleure façon de page, un tableau
- 6. Quelle est la meilleure façon de supprimer un élément de tableau en PHP?
- 7. Quelle est la meilleure façon d'effacer un tableau de chaînes?
- 8. quelle est la meilleure façon de fusionner pdfs en java
- 9. Quelle est la meilleure façon d'arrêter un thread dans Java?
- 10. Meilleure façon de trier un tableau
- 11. Quelle est la meilleure façon de stocker si un élément rss a été lu ou non
- 12. Quelle est la meilleure façon de faire ce programme Java?
- 13. quelle est la meilleure façon de modifier le fichier csv
- 14. Quelle est la meilleure méthode pour obtenir la clé du dernier élément de tableau ajouté en PHP?
- 15. Quelle est la meilleure façon d'implémenter un contrôleur en PHP?
- 16. Quelle est la meilleure façon d'obtenir un HashTable en PHP?
- 17. Quelle est la meilleure façon de trouver le répertoire de base d'un utilisateur arbitraire en Java?
- 18. Quelle est la meilleure façon d'initialiser un tableau sur un tableau de longueur fixe? (C++/CLI)
- 19. Quelle est la meilleure façon d'implémenter hashCode()?
- 20. Quelle est la meilleure bibliothèque Java OXM?
- 21. Quelle est la meilleure façon d'enregistrer un RichTextFile en C#?
- 22. Quelle est la meilleure façon de détecter si un mot de NSString a un numéro?
- 23. Quelle est la meilleure façon d'apprendre Java EE pratiquement?
- 24. Quelle est la meilleure façon de déterminer si un caractère est une lettre dans VB6?
- 25. javascript, la meilleure façon de dire si un val est un seul chiffre
- 26. Quelle est la meilleure façon de détecter si un serveur proxy est disponible?
- 27. Quelle est la meilleure façon d'exécuter `sum_by_sql`?
- 28. Quelle est la meilleure façon d'apprendre WCF?
- 29. Quelle est la meilleure façon de trier un IList <T> dans .Net 2.0?
- 30. Quelle est la meilleure façon d'actualiser un tableau de cumul en charge?
merci !! Im en utilisant votre code, mais avec quelques modifications mineures: –
quel genre de sorte est-ce? a-t-il un nom? –
Ce n'est pas une sorte. Ceci est une insertion dans l'ordre. Il est utile lorsque vous avez un tableau ordonné et que vous voulez insérer un élément tout en conservant le tableau trié: Vous venez de mettre le nouvel élément à la fin du tableau et d'appliquer cet algorithme. L'algorithme de tri d'insertion mentionné dans les autres réponses est simplement une généralisation de ceci: pour trier un tableau, commencez avec un tableau vide et insérez dans l'ordre chacun des éléments du tableau source. – gpeche