2010-09-18 5 views
2

J'ai une question pour une affectation de laboratoire C++ que j'ai. La tâche consiste à implémenter une fonction pour ajouter des valeurs, supprimer des valeurs d'un tableau et ainsi de suite. Je l'ai fait la plupart du temps maintenant, mais j'ai un problème avec la fonction d'insertion. L'affectation nécessite que j'insère des valeurs flottantes dans ce tableau sans utiliser d'algorithme pour le trier après chaque insertion. Je ne peux pas utiliser quoi que ce soit de STL non plus. Cela supposera que j'insère immédiatement toutes les valeurs en position triéeplacer une valeur dans la position triée immédiatement

Je me demande si quelqu'un pourrait me donner une idée de la façon dont ce problème peut être résolu?

EDIT Cette affectation Je ne vais pas l'implémenter avec une liste chaînée. Ce sera pour ma prochaine affectation.

J'ai essayé d'écrire une fonction d'insertion en fonction de votre pseudo code. Je ne l'ai pas compris correctement. Voici le code de toute façon.

void array_insert(data_t list[], int& space_used, data_t value) 
{ 

    if(space_used == 0) 
    { 
     list[space_used] = value;  
    } 
    else 
    { 

     for(int i = space_used+1; i >= 0; i--) 
     { 
     if(value > list[i]) 
     { 
      list[i+1] = value; 
      break; 
     } 
     else 
     { 
      list[i+1] = list[i]; 
     } 
     if(i == 0) 
     { 
      list[i] = value; 
     } 
     } 
    } 
    space_used++; 
} 

enfin terminé, voici le code complet. Merci pour l'aide de Mark et Casablanca

+0

voir ma nouvelle réponse – msw

Répondre

4

Vous devez décaler tous les éléments pour faire de la place pour le nouvel élément. C'est une opération O (n). Puisque vous ne pouvez pas faire mieux que O (n) Je pense qu'il est raisonnable d'utiliser ce simple O (n) algorithme:

  • Set i à l'index du dernier élément du tableau
  • Si la l'élément à insérer est plus grand qu'un [i] puis insère l'élément à l'index i + 1 et s'arrête.
  • Sinon, réglez [i + 1] = a [i] puis diminuez i et répétez l'étape précédente.
  • Si i atteint 0, insérez l'élément au début.

Cela suppose que votre tableau dispose d'espace pour insérer un élément supplémentaire.

+0

Je n'ai pas réussi à faire fonctionner l'algorithme. Pouvez-vous vérifier si je l'ai écrit correctement? – starcorn

+0

@klw: Vous avez quelques erreurs. Pour commencer, 'i

+0

@Mark Byers: J'ai vu une erreur de plus à côté de celle que vous mentionnez. De toute façon je ne peux toujours pas trouver pourquoi ça ne marche toujours pas. Je peux voir que l'algorithme va de l'arrière pour voir si la valeur est plus grande que la valeur de tableau actuelle, sinon déplacez la valeur de tableau d'un pas en avant et continuez la comparaison, jusqu'à ce que vous atteigniez la dernière valeur. – starcorn

2

Vous pouvez trouver la position d'insertion en utilisant binary search.

+0

mais je doit encore réorganiser la tableau par exemple J'ai un tableau avec la valeur 1,2,3,5 et je veux insérer 4 maintenant. Je vais devoir repositionner 5.Ou ai-je raté le point avec la recherche binaire? – starcorn

+2

@klw: Le seul but d'une recherche binaire est de vous dire où insérer. Le pseudo-code de Mark Byers est la façon dont vous allez réellement * effectuer * l'insertion. – greyfade

+0

@starcorn, Il y a une implémentation astucieuse de la recherche binaire qui implique le retour de '-index' au cas où l'élément n'est pas trouvé, en multipliant' -1' vous obtenez la position où l'insertion devrait être faite .... bien sûr, vous aurez besoin de changer, mais la recherche sera plus rapide. – st0le

2

Pensez à des tâches distinctes qui doivent être fait pour insérer:

  1. Trouver l'indice n où le nouvel élément doit être
  2. déplacer tous les éléments de la dernière à n (y compris) jusqu'à une fente dans le tableau (uniquement s'il y a des cellules non utilisées dans le tableau, sinon donner et signaler une erreur)
  3. mettre le nouvel élément dans array[n]

le f IRST deux étapes pourraient facilement être leurs propres fonctions et pourraient vous aider à séparer mentalement les tâches:

  1. n = index_to_put(float new_element, float *array, int array_max, int last_used);
  2. new_last_used = move_cells_up(float *array, n, int array_max, int last_used);
  3. array[n] = new_element; last_used = new_last_used;
Questions connexes