sortowanie i pomiar czasow

0

Witam,
Walczę od pewnego czasu z programem do pomiaru czasów różnych wersji sortowania w zależności od typu danych wejściowych. I z uwagi na to, że wychodziły mi bardzo nierówne dziwne pomiary, chcę zrobić jeden program, który będzie dla wszystkich typów tablicy wejściowej wykonywał pomiary.
Na razie jestem w połowie i mam coś takiego:

 #include <cmath>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>


using namespace std;

long czas()
  {
   static clock_t start=0;
   clock_t teraz=clock();
   long wynik=((1000*(teraz-start)+(CLOCKS_PER_SEC>>1))/CLOCKS_PER_SEC);
   start=teraz;
   return wynik;
  }


int main()
{   

    cout<<"Selection sort\n";
    
    cout<<"Kolejnosc losowa\n";
    int N;
    
   for (N=10000; N<=310000; N=N+20000)
    
 {   int d[N], j, i, min;
     
    srand((unsigned)time(NULL));

  for(i = 0; i < N; i++) d[i] = rand() % 100;
 // for(i = 0; i < N; i++) cout << setw(4) << d[i];
  //cout << endl;
   
   czas();

   
    for (j=0; j<N-1; j++)
    {
    d[min]=d[j];
    for (i=j+1; i<N; i++) 
    if (d[i]<d[min]) min=i;
     swap(d[min], d[j]);
     }
     
// for (i=0; i<N; i++) cout<<setw(4)<<d[i]; cout<<endl;
    printf("Czas wykonywania dla %d elementow : %lu ms \n", N, czas());
    for(unsigned long int i=0;i<N;i++) d[i]='\0';
}



 { cout<<"Kolejnosc uporzadkowana rosnaca\n";
    int Z; 
    
 {   int d[Z], j, i, min;
     
 for (Z=10000; Z<=310000; Z=Z+20000)
 { for(i = 0; i < Z; i++) d[i] = i+1;
  //for(i = 0; i < Z; i++) cout << setw(4) << d[i];
  //cout << endl;
   
   czas();

   
    for (j=0; j<Z-1; j++)
    {
    d[min]=d[j];
    for (i=j+1; i<Z; i++) 
    if (d[i]<d[min]) min=i;
     swap(d[min], d[j]);
     }
     
//for (i=0; i<Z; i++) cout<<setw(4)<<d[i]; cout<<endl;
    printf("Czas wykonywania dla %d elementow : %lu ms \n", Z, czas());
    for(unsigned long int i=0;i<Z;i++) d[i]='\0';
    
    }
}
}
   
    system("PAUSE");
    return 0;
}

Założenie jest takie: dla kolejnych rozmiarów tablicy najpierw podaje czas sortowania przy kolejnosci losowej, potem przy juz posortowanej... Do tego chcę dorzucić jeszcze kilka wersji tablicy i potem to sobie odpalić, żeby mi ładnie wszystkie czasy pomierzyło.
Jednak mam problem: czasem program działa, czasem się wiesza już na etapie kolejności losowej, czasem przechodzi całą losową, ale wiesza się przy posortowanym itd itp. Nie chcę go dalej rozwijać, póki nie ogarnę tej części, ale nie potrafię pojąć, czemu raz działa raz nie, wieszając się na różnych etapach...
Jestem dość początkująca dlatego wszystkie rady są mile widziane :)

0

Nie można robic czegoś takiego, jak w twoim programie:

int Z;
int d[Z];

Dziwię się, że ci się to kompiluje. Mój Visual 2010 Express wyrzuca błędy kompilacji. Próbujesz utworzyć tablicę int-ów bez wskazania jej rozmiaru. Dodatkowo tworzenie tablicy na stosie wymaga podania jej rozmiaru podczas kompilacji, np:
int d[5000]
lub
const int iSize = 5000;
int d[iSize];

Jeśli rozmiar tablicy nie jest znany podczas kompilacji, to musisz utworzyć tablicę dynamicznie
int* d = new int[jakiś rozmiar];

To samo jest w przypadku pętli for:

for (int i=10000; i<=32000; i++)
{
int* d = new int[i]
///robimy coś na naszej tablicy
delete[] d; //zwalniamy zaalokowaną wcześniej pamięć
}

0

Dodatkowo dla obu linii
d[min]=d[j];

mój Visual wyrzuca ostrzeżenia:
1>...\sortingtest.cpp(40): warning C4700: uninitialized local variable 'min' used

Czyli wpisujesz coś do tablicy "d" i nawet nie wiadomo na jakim indeksie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1