2010-12-10 27 views
4

J'ai une fonction qui prend un tableau de nombres et les classe de bas en haut. Jusqu'à présent, j'ai cet algorithme, mais la sortie n'est pas ce que j'attends. Quelqu'un peut-il nous éclairer? Je ne peux pas utiliser les fonctions de la bibliothèque C.Tri d'un tableau en C de bas en haut (sans utiliser qsort)

/* 
    Sort "count" numbers stored in array numbers[] in non-decreasing order. 
    There may be duplicate numbers in the array. 
    You may use any sorting algorithm that you know. 
*/ 

void sort(double numbers[], int count) 
{ 
    int i, j, k; 
    //printf("%d", count); 

    double temp; 
    do{ 
     j = 0; 
     for (i = 0;i<=count;i++){ 
       if (numbers[i] > numbers[i+1]){//this was numbers[k], which was an error 
        j = 1; 
        temp = numbers[i]; 
        numbers[i] = numbers[i+1]; 
        numbers[i+1] = temp; 
       } 
      } 
    } while (j == 1); 
} 
+0

Qu'est-ce 'K' ...? – sje397

+2

C'est un int. :-) – Eiko

Répondre

5

La condition dans for boucle i<=count est incorrecte.

Les indices valides dans la matrice sont 0 à count-1.
Puisque vous accédez à la valeur à l'index i+1 dans la boucle:

if (numbers[i] > numbers[i+1]) 

i peut prendre la valeur 0-count-2, donc changer la condition de i<=count-2 ou i<count-1

+0

Ça marche maintenant merci. –

+0

Bon à savoir que ... mais n'oubliez pas de lire le lien wiki donné par @stillstanding. Votre implémentation peut être optimisée. – codaddict

0

La valeur de k est utilisée, mais la variable est jamais initialisé ou affecté. À un certain moment votre code tentera d'accéder à la valeur numbers[count], lorsqu'un tableau contenant des éléments count a indice maximum count-1

0

Vous n'avez pas initalised k.

L'algorithme s'arrêtera dès qu'il aura déplacé un seul nombre. Vous devez les déplacer tous.

Je pense qu'il vous manque une boucle for sur k en dehors de la boucle while, mais comme je ne suis pas entièrement sûr de ce que vous essayez de faire ici, je ne peux pas en être sûr. Pourquoi ne pouvez-vous pas implémenter votre propre fonction qsort()? Est-ce autorisé? Essayez de lire quelques algorithmes de tri en ligne.

0

si (nombre [i]> nombres [k]) {

devrait probablement être

si (nombre [i]> chiffres [i + 1]) {

k ISN » t utilisé du tout.

for (i = 0;i <= count;i++){ 

devrait probablement

for (i = 0; i < count-1;i++){ 

comme il y a des éléments que de 0 à compter-1, puis vous comparez à la suivante. Le nom de j est merdique. Faites-en un booléen appelé didSwap. Et puis repensez votre codition, peut-être c'est juste l'inverse ...

+0

Désolé [k] était une modification précédente. J'ai changé cela à [i + 1 mais en vain ... –

+0

C'est pourquoi j'ai mentionné la chose de compte - mais SO foiré avec le texte et n'a pas montré le code complet ... – Eiko