2014-07-11 6 views
-3

J'essaie de trier un tableau en utilisant le tri par insertion.
Au lieu de changer et de réorganiser les éléments du tableau lui-même, j'utilise un autre tableau nommé rank to Map pour pointer sur le tableau original.
ici est mon codeTri du tableau par tri par insertion

int i,j; 
int ar[] = {50,14,51,25,10}; 
int rank[] = {0,1,2,3,4}; 
for(i=1 ; i< 5 ; ++i) // second element onwards 
{ 
    int temp = rank[i]; // stores current value in temp variable  

    /** 
    * temp = 1 
    * j = 0 
    */ 
    j = rank[i] - 1; 
    while (ar[temp] < ar[ rank[j] ] && j > -1) 
    { 
     rank[j+1] = rank[j];  // move elemnts in map forward 
     j--; 
    } // end loop 

    // insert temp at proper place 
    rank[j+1] = temp;  

} 

for(i=0 ; i< 5 ; ++i) 
    printf("Rank : %d, Number : %d \n",rank[i],ar[i]); 

Mais, il ne donne une sortie attendue. Quelqu'un peut-il pointer vers quelle est l'erreur dans la logique?

+2

Vous allez devoir l'affiner plus loin que simplement "Cela ne fonctionne pas". Obtenez un cas de test simple, utilisez un débogueur et suivez l'exécution du code.Les chances sont, cela vous aidera à trouver la solution. Si ce n'est pas le cas, il va au moins le réduire à une section spécifique du code. – wolfPack88

+0

'j = rang [i] - 1;'. Essayez-vous de décrémenter la valeur dans l'élément «i» ou d'accéder à l'élément juste avant «i»? –

+0

J'ai utilisé le débogueur netbeans. Ce que j'ai découvert c'est que j va à -2 au lieu de s'arrêter à -1. donc j'ai ajouté une contrainte supplémentaire j> -1 dans while loop.now quand j = -1 alors condition à l'intérieur alors que loop devrait renvoyer false l'arrêtant. mais ça revient vrai et je ne sais pas pourquoi. – Shashi

Répondre

1

défaut Vous logique est la suivante: Dans cette section de code

while (ar[temp] < ar[ rank[j] ] && j > -1) 
    { 
     rank[j+1] = rank[j];  // move elemnts in map forward 
     j--; 
    } // end loop 

rank[j] signifie le rang de la valeur à ar[j].

Et lorsque vous utilisez ar[rank[j]], vous comparez ar[temp] à la valeur indexée à "the rank of the value at ar[ j ]", ce qui signifie que vous ne comparez pas à la plus grande valeur dans la partie triée de rank[].

Par conséquent, vous ne pouvez pas entrer dans cette boucle, même si ar[temp] est le deuxième plus petit

Par exemple:

Jusqu'à présent au cours de la boucle # 2 (i = 2)

ar []: {50 14,51,25,10};

rank []: {1,0,2,3,4}; ({} Est 1,0 la partie triée de rang [])

Le seul moyen 014 est la plus petite valeur {50,14} (la partie balayée de ar[]) ET ar[rank[2]] (ar[0]) ne se produit que pour la la plus grande valeur {50,14} (la partie balayée de ar[]) par hasard

Si cette valeur (ar[rank[2]]) est le plus grand, et se trouve être plus petit que ar[temp], vous programme, sautez simplement la boucle. Même si ar[temp] est plus petit que toutes les autres valeurs de ar[]

0
rank[j+1] = rank[j] 

n'a aucun sens. Vous devriez les échanger.

0

C'était le code que j'avais quand pris des structures de classe des données ...

Dans la condition while vérifie V ... et à l'intérieur de la boucle, il déplace les éléments en V ...

En votre code que vous comparez dans un tableau et déplace dans l'autre ... si vous avez besoin de la position originale des éléments, vous pouvez simplement copier le tableau dans un nouveau et trier le nouveau tableau, au lieu de créer ces rangs ... vous avez vraiment besoin de ces rangs je suis assez sûr que vous pourriez créer pendant que vous sortez)

+0

Que diriez-vous d'ajouter ceci dans une section de code au lieu d'une image? Peut-être le traduire aussi ... – dragosht