2009-04-25 1 views
0

Désolé, je suis sûr que c'est simple mais je suis fatigué et je n'arrive pas à comprendre.Comment puis-je effectuer un tri d'insertion mais vérifier une propriété de l'élément dans le tableau pas seulement l'élément?

J'ai un tableau d'éléments, chaque élément est en fait une particule qui est une structure de données (une structure en c) contenant, entre autres choses, la position actuelle des particules (int x, y, z). Je veux comparer les éléments x position pas seulement l'élément lui-même.

En regardant le pseudocode on wikipedia, j'ai essayé de le modifier pour comparer l'attribut que je veux mais je pense que j'ai fait quelque chose (probablement simple) faux.

Voici ce que j'ai modifié:

for (i = 1; i<length; i++) { 
    value = particles[i].position.x;  
    j = i - 1; 
    while (j >= 0 && particles[j].position.x > value) { 
     particles[j+1] = particles[j]; 
     j = j - 1; 
    } 
    particles[j+1] = particles[i]; 
} 

Si quelqu'un pouvait me signaler mon erreur, ce serait génial!

Adam

+0

Eh bien, je suppose que cela ne fonctionne pas « cos l'application va froussard après avoir écrit cette partie mais il * pourrait * être autre chose, Je me suis dit que c'était parce que j'étais fatigué et il m'a fallu énormément de temps pour le réécrire. –

Répondre

4

Votre 2ème ligne agit pour stocker une copie temporaire de l'élément ith, car la boucle while l'écrase. Pourtant, dans votre 2e ligne dernière, vous lisez de la valeur écrasée. Changer votre code à la suivante et il devrait fonctionner (changements commentés):

for (i = 1; i<length; i++) { 
    value = particles[i]; // store particles[i] rather than it's x coordinate 
    j = i - 1; 
    while (j >= 0 && particles[j].position.x > value.position.x) { // changed 
     particles[j+1] = particles[j]; 
     j = j - 1; 
    } 
    particles[j+1] = value; // copy from temporary 
} 
+0

Merci beaucoup qui l'a réparé! –

1

Vous avez besoin d'échanger des objets de particules, et non pas les valeurs des coordonnées x. Essayez:

for (i = 1; i<length; i++) { 
    value = particles[ i ]; 
    /* ... */ 
Questions connexes