2011-02-11 4 views
1

Je dois chronométrer la durée d'un tri à bulles et imprimer le temps qu'il a fallu. Dans mon programme, l'heure imprimée est toujours 0,00 secondes. Quelqu'un peut-il me dire ce que je fais mal?Chronométrage d'un tri à bulles

int main() 
{ 
    srand((unsigned)time(NULL)); 
    int arr[5000], arr2[5000]; 
    int i; 
    time_t start, end; 
    double timeDiff; 

    for(i=0; i < 5000; i++) 
    { 
     arr[i] = rand() % 100 + 1; 
     arr2[i] = arr[i]; 
    } 

    cout << "Here is the initial array:" << endl; 
    printArray(arr, 5000); 

    time(&start); 
    bubbleSort(arr, 5000); 
    time(&end); 
    timeDiff = difftime(end, start); 

    cout << "\nHere is the array after a bubble sort:" << endl; 
    printArray(arr, 5000); 
    cout << fixed << setprecision(2) << "\nIt took " << timeDiff << " seconds to bubble sort the array." << endl; 

    system("pause"); 
    return 0; 
} 
+0

Il semble que la granularité de time_t soit trop grande pour capturer le temps pris par votre routine de tri (ie 'bubble Sort' s'exécute en moins d'une seconde). Vous devrez exécuter la routine plusieurs fois pour qu'elle prenne suffisamment de temps pour s'enregistrer. –

+0

Notez que le tri à bulles n'a pas sa place dans l'informatique autre que comme une illustration de la façon de ne pas faire les choses. –

+0

c'était une affectation pour une classe. nous devions créer un tableau de 5000 et le remplir avec des nombres 1-100, puis lancer deux méthodes de tri différentes. – Joshua

Répondre

4

Il s'exécute plus rapidement que l'horloge du processeur prend pour mettre à jour. Ce que vous avez à faire est d'exécuter votre tri quelques millions de fois, et de diviser le temps par le nombre d'itérations (en veillant à utiliser un double pour obtenir la plus grande précision possible.) Donc, quelque chose comme:

const int runs=1000000; 
time(&start); 

for(int r=0;r<runs;++r) 
    bubbleSort(arr, 5000); 

time(&end); 
timeDiff = difftime(end, start); 

double realduration=timeDiff/(double)runs; 
+2

tout vrai, avec une précision de minuterie de 1 seconde et un temps d'exécution d'un peu moins d'une seconde (ajout d'une implémentation de tri à bulles au code ci-dessus et fonctionnant sur mon ordinateur portable), fonctionner pendant 10 jours pour obtenir une sortie avec une précision de 10ms semble plutôt inefficace par rapport à une meilleure minuterie. Ou lancez-le pendant 100s, alors vous savez que vous avez votre précision de 0.01s. –

+3

Un problème avec la boucle tel que présenté est qu'après la première itération, le tableau est trié. Par la suite, vous ne faites que chronométrer le meilleur scénario du bubbleort - un tableau déjà trié. – Sparky

+0

En raison de ce que Sparky a déjà souligné, non seulement c'est inefficace, mais c'est incorrect. – jwir3

6

Je pense que vous avez besoin d'utiliser quelque chose qui a un peu plus de précision que difftime (qui rapporte seulement en secondes):

Voir: Time difference in C++ pour plus d'informations.

+1

http://stackoverflow.com/questions/275004/c-timer-function-to-provide-time-in-nano-seconds vaut également la peine de regarder –

0

5000 est à petit pour vous inscrire, vous devez exécuter le processus de tri 100 ou 1000 fois diviser ensuite par ce nombre pour obtenir un peu de temps

on m'a dit que pour obtenir un peu d'un bon moment que vous devez avoir le programme dure de 5 à 10 sec