Proszę o pomoc w celu rozwiązania problemu, który zwraca błąd:
Kod: Zaznacz cały
Segmentation fault
Program działa dobrze do liczb mniejszych niż 33 tysiące, przy większych liczbach dostaję wspomniany błąd.
W założeniu program ma pracować na tablicach do 1.000.000 elementów.
Drugi problem polega na tym iż dostaję ten sam błąd dla małych liczb +/- 1000 w momencie gdy komentarzem ujmę opcję ,,for'' w 57 linijce odpowiadającą za wyświetlanie tablicy po sortowaniu. Jeśli ktoś ma jakiekolwiek uwagi do kodu niech też napisze.
Kod: Zaznacz cały
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
int generuj(int ilosc, int tablica[]);
int bublesort(int ilosc, int tablica[]);
int wstawianie(int ilosc, int tablica[]);
void szybkie(int lewy, int prawy, int tablica[]);
int kopcowanie(int ilosc, int tablica[]);
float czas;
clock_t start,stop;
int main()
{
int N,tab[N],x;
cout << "Podaj ilość liczb do wylosowania i posortowania: ";
cin >> N;
generuj(N,tab);
cout << endl << " WYBIERZ SORTOWANIE: " << endl << endl << "1.Sortowanie babelkowe" << endl << "2.Sortowanie przez wstawianie" << endl
<< "3.Sortowanie szybkie" << endl << "4.Sortowanie przez kopcowanie"<<endl<< endl <<"Twój wybór to: ";
cin >> x;
if(x>5 || x<=0) cout << "PODAJ ODPOWIADAJACA LICZBE Z ZAKRESU <1-4>" << endl;
else
{
switch(x)
{
case 1:
start=clock();
bublesort(N,tab);
stop=clock();
cout << "czas wykonyania sortowania to: " << (stop-start)/(double)CLOCKS_PER_SEC;
break;
case 2:
start=clock();
wstawianie(N,tab);
stop=clock();
cout << "czas wykonyania sortowania to: " << (stop-start)/(double)CLOCKS_PER_SEC;
break;
case 3:
start=clock();
szybkie(1,N,tab); // PRZY WYNIKI Z SORTOWANIA DWA PIERWSZE ELEMENTY NIE SA POSORTOWANIE 84 I 0
stop=clock();
cout << "czas wykonyania sortowania to: " << (stop-start)/(double)CLOCKS_PER_SEC;
break;
case 4:
start=clock();
kopcowanie(N,tab); // TAK SAMO JAK WYŻEJ
stop=clock();
cout << "czas wykonyania sortowania to: " << (stop-start)/(double)CLOCKS_PER_SEC;
break;
}
for(int i=0; i<N; i++) cout << tab[i]<<endl; //tablica po sortowaniu
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int generuj(int ilosc, int tablica[]){
//cout << "generuj przed forem" << endl;
for(int i=0; i<ilosc; i++)
{
tablica[i]=rand() % 100;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int bublesort(int ilosc, int tablica[]){
int p;
for(int i=ilosc-1; i>0; i--)
{
p=1;
for(int j=0; j<i; j++)
{
if(tablica[j]>tablica[j+1])
{
swap(tablica[j],tablica[j+1]);
p=0;
}
}
if(p) break;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int wstawianie(int ilosc,int tablica[])
{
int x,i;
for(int j=ilosc-2; j>=0; j--)
{
x=tablica[j];
i=j+1;
while( (i<ilosc) && (x>tablica[i]) )
{
tablica[i-1]=tablica[i];
i++;
}
tablica[i-1]=x;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void szybkie(int lewy, int prawy, int tablica[])
{
int i,j,piwot;
i=(lewy+prawy)/2;
piwot=tablica[i]; tablica[i]=tablica[prawy];
for(j=i=lewy; i<prawy; i++)
if(tablica[i] < piwot)
{
swap(tablica[i], tablica[j]);
j++;
}
tablica[prawy]=tablica[j]; tablica[j]=piwot;
if(lewy< (j-1) ) szybkie(lewy, j-1,tablica);
if( (j+1) <prawy) szybkie(j+1, prawy,tablica);
return ;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int kopcowanie(int ilosc, int tablica[])
{
//Stawiamy kopiec
int j,k,x,m;
for(int i=2; i<=ilosc; i++)
{
j=i; k=j/2;
x=tablica[i];
while( (k > 0) && (tablica[k] < x) )
{
tablica[j] = tablica[k];
j= k; k=j/2;
}
tablica[j]=x;
}
// Rozbieramy kopiec
for(int i=ilosc; i>1; i--)
{
swap(tablica[1], tablica[i]);
j=1; k=2;
while(k<i)
{
if( (k+1<i) && (tablica[k+1] > tablica[k]) )
m=k+1;
else
m=k;
if(tablica[m] <= tablica[j]) break;
swap(tablica[j], tablica[m]);
j=m; k=j+j;
}
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////