2015-06-11 4 views
0

Im почти сделан с моим кодом, но мне нужна помощь с таймером для сортировки пузырьков и сортировки радикса. время всегда на ноле, я пробовал все, но он всегда заканчивается как ноль. это что-то не так с кодом. или тип таймера, который я использую.Bubble & Radix Сортировочный тест

обновление ... так что я исправил время, когда я работаю над сортировкой, чтобы определить, сортирует ли функция массив ... это то, что у меня есть, и его все еще iffy. он начинает показывать несколько «не отсортированных» и «отсортированных» при печати.

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

using std::cout; 
using std::cin; 
using std::endl; 


int const temp = 10000; 

void bubbleSort (int array [ temp ]); 
void radixSort (int array [ temp ]); 

int main () 
{ 
    int A1; 
    int array [ temp ]; 
    char a = '\0'; 

    cout << "\nWould You Like To Perform Bubble and Radix Test? (y/n): "; 
    cin >> a; 

    if (a == 'y' || a == 'Y') 
    { 
     srand ((unsigned) time (0)); 

     for (size_t i = 0; i < temp; i++) 
     { 
      A1 = (rand () % temp) + 1; 

      array [ i ] = A1; 
     } 

     cout << "\n-- Please Wait For Result --" << endl; 

     bubbleSort (array); 
     radixSort (array); 
    } 
    else 
    { 

    } 

    return 0; 
} 

void bubbleSort (int array [ temp ]) 
{ 
    int temp1; 
    time_t start, end; 
    clock_t start = clock (); 

    for (int i = 0; i < temp - 1; i++) 
    { 
     for (int j = 0; j < temp - i - 1; j++) 
     { 
      if (array [ j ] > array [ j + 1 ]) 
      { 
       temp1 = array [ j ]; 
       array [ j ] = array [ j + 1 ]; 
       array [ j + 1 ] = temp1; 
      } 
     } 

    } 

for (int s = 1; s < temp; ++s) 
       { 
        if (array [ s ] > array [ s - 1 ]) 
        { 
         cout << "sorted" << endl; 
        } 
        else 
        { 
         cout << "not sorted" << endl; 
        } 
       } 
    clock_t end = clock (); 

    printf ("Sorting Time: %f seconds\n", (double) (end - start)/1000000); 
    } 

void radixSort (int array [ temp ]) 
{ 
    int mx = array [ temp ]; 
    int temp1; 

    clock_t start = clock (); 

    for (int i = 1; i < temp; i++) 
    { 
     if (array [ i ] > mx) 
     { 
      mx = array [ i ]; 

      for (int j = 1; (mx/j) > 0; j *= 10) 
      { 
       int out [ temp ]; //output array 
       int k, count [ 10 ] = { 0 }; 

       for (k = 0; k < temp; k++) 
       { 
        count [ (array [ k ]/i) % 10 ]++; 
       } 
       for (k = 1; k < 10; k++) 
       { 
        count [ k ] += count [ k - 1 ]; 
       } 
       for (k = i -1; k >= 0; k--) 
       { 
        out [ count [ (array [ k ]/i) % 10 ] - 1 ] = array [ k ]; 
        count [ (array [ k ]/i) % 10 ] --; 
       } 
       for (k = 0; k < temp; k++) 
       { 
        array [ k ] = out [ k ]; 
       } 
      } 
     } 
    } 

for (int s = 1; s < temp; ++s) 
       { 
        if (array [ s ] > array [ s - 1 ]) 
        { 
         cout << "sorted" << endl; 
        } 
        else 
        { 
         cout << "not sorted" << endl; 
        } 
       } 

     clock_t end = clock (); 

    printf ("Sorting Time: %f seconds\n", (double) (end - start)/1000000); 
} 
+0

'temp' - невероятно плохое имя для' size' массива. – ooga

+0

'time_t' (возвращаемое значение' time') обычно имеет разрешение в одну секунду. Поэтому, если пробег занимает меньше секунды, вы получите нулевое время. Вместо этого вы должны использовать функцию 'clock'. – ooga

+0

Не меняйте свой вопрос посередине. Задайте новый вопрос. – Matt

ответ

0

time не имеет достаточно хорошее разрешение для выполнения этой задачи. Используйте clock вместо этого, что-то вроде этого:

clock_t start = clock(); 
// ... 
clock_t end = clock(); 
printf("%f seconds\n", (double)(end - start)/CLOCKS_PER_SEC); 

Вы также можете запустить подпрограмму несколько раз (100 или 1000, например), а затем разделить общее время на количество повторений процедуры.

+0

Спасибо, что он отлично работал – anderson