2012-03-23 1 views
1

J'utilise le tri par insertion pour trier une liste de chaînes (EmailingListArray ci-dessous). EmailingListArray[1] est un tableau contenant des noms. EmailingListArray[2] contient les emails correspondants. Je trie EmailingListArray[1] et quand quelque chose change dedans, il change aussi le deuxième tableau, ainsi ils sont triés ensemble. Une façon maladroite de faire les choses, je sais, mais il est pour les cours et je voulais mettre une sorte d'insertion dans un endroit pour essayer obtenir une marque supplémentaire: LImpossible de trouver une erreur simple dans l'algorithme de tri par insertion Delphi

Voici mon code

//quick check to make sure array contains correct values 
for first := 0 to EmailingListArray[1].Count do 
    ShowMessage(EmailingListArray[1][first]); 

//then sort 
First := 0; 
Last := EmailingListArray[1].Count; 
for CurrentPointer := First +1 to Last-1 do 
begin 
    CurrentValue := EmailingListArray[1][CurrentPointer]; 
    CurrentValue2 := EmailingListArray[2][CurrentPointer]; 
    Pointer := CurrentPointer + 1; 
    while ((EmailingListArray[1][Pointer] > CurrentValue) AND (Pointer > 0)) do 
    begin 
     EmailingListArray[1][Pointer+1] := EmailingListArray[1][Pointer]; 
     EmailingListArray[2][Pointer+1] := EmailingListArray[2][Pointer]; 
     pointer := Pointer -1; 
    end; 
    EmailingListArray[1][Pointer + 1] := CurrentValue; 
    EmailingListArray[2][Pointer + 1] := CurrentValue; 
end; 

    //show message at the end for a check 
    ShowMessage('hello?'); 

Le message " Bonjour?" n'est pas affiché pour une raison quelconque: S. Le programme ne plante pas ou quoi que ce soit, il devrait donc au moins afficher "bonjour?" à la fin. Ce n'est pas non plus le tri de mes baies. Je ne sais pas non plus si l'algorithme est écrit correctement, je l'ai sorti de notre manuel. Toute aide serait grandement appréciée!

Répondre

3

Si vous voulez obtenir une bonne note:

  1. Évitez de donner des noms trompeurs pour vos variables:

    • CurrentPointer doit être appelé CurrentIndex ou CurrentPosition comme il est un indice et non un pointeur
    • Pointer est à éviter (réservé pour Pointer type) et plus encore car ce n'est pas un pointeur; devrait être WorkIndex ou WorkPosition
  2. Lire l'algorithme de tri d'insertion (wikipedia a simple pseudocode pour tableau indexé de 0) et mettre en œuvre correctement:

    WorkIndex := CurrentIndex - 1; // - not + in your "Pointer := CurrentPointer + 1;"

  3. Obtenez votre gamme d'index from 0 to Count-1 pour un TStrings.

  4. Ne pas mélanger les 2 tableaux:
    EmailingListArray[2][WorkIndex + 1] := CurrentValue2; // not CurrentValue

Mise à jour: Vous avez manqué le mauvais état alors que pour le tableau à base zéro.

2bis. Tandis que la condition devrait être avec> = 0, pas> 0

while ((EmailingListArray[1][WorkIndex] > CurrentValue) AND (WorkIndex >= 0)) do 
+0

Merci, son tri bien maintenant, juste un problème, c'est de ne pas trier le premier élément. Pensez que c'est ce que vous vouliez dire par le point 3, mais ne savez pas quoi faire: S – JamesB123

+1

@ JamesB123, voir ma mise à jour ... –

+0

Thanks man! Appréciez-le :) – JamesB123

Questions connexes