2010-09-19 5 views
3

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

1

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.

3

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--; 
} 
+0

merci !! Im en utilisant votre code, mais avec quelques modifications mineures: –

+0

quel genre de sorte est-ce? a-t-il un nom? –

+1

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

0
//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; 
0

Ê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()]); 
+1

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

+0

Oups, merci meriton. J'ai corrigé la réponse. – wolfcastle

+0

merci, mais pour l'école, je suis obligé de coder mes propres routines de tri, mais cela semble sehr cool! –

Questions connexes