Napisałem program sortujący algorytmem quicksort, gdzie pivotem jest mediana z 3 wylosowanych liczb (wyznacza go funkcja pivot). I teraz mam problem gdyż przy rekurencyjnym wywołaniu funkcji qs, gdy podaje w paratrze funkcję pivot(do funkcji qs jest potrzebny pivot wyznaczony w sposób opisany powyżej) wyskakuje segmentation fault ;/ Gdy podaje jako ten parametr coś innego (np tab[l] i tab[i] - pierwsze elementy w podzbiorach, które powstały przez podział w poprzednim wywołaniu) wtedy wszystko jest ok więc problem raczej leży w tym parametrze. Co robię źle???
Z góry dziękuję za pomoc ;))
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std;
int *tab,i=0,j=0,n=0,x=0;
int pivot(int tab[],int l,int p) //Funkcja wyznacvza pivot (mediana z 3 wylosowanych liczb)
{
int *tab_los,tmp=0,k=0,roznica=0,g=0;
tab_los=new int[3];
//Losowanie elementów
srand(time(NULL));
if (n<3) x=n;
else x=3;
roznica=p-l;
for (i=0;i<x;i++)
{
k=i;
g=(rand() % roznica)+l;
tmp=tab[g];
for (j=0;j<x;j++)
{
if (tmp==tab_los[j]) i--; // Jęsli element już jest w tablicy to losuj jeszcze raz dla konkretnego i
}
tab_los[k]=tmp;
}
//Sortowanie wylosowanych elementów
for (i=0;i<x-1;i++)
{
for (j=0;j<x-1;j++)
{
if (tab_los[j]>tab_los[j+1]) swap(tab_los[j],tab_los[j+1]);
}
}
//Zwracanie wyniku i usuwanie tablicy
if (x<3) k=tab_los[0];
else k=tab_los[1];
delete [] tab_los;
return k;
}
int qs(int tab[],int l,int p,int sr)
{
i=l;
j=p;
while (i<=j)
{
while (tab[i]<sr) i++;
while (tab[j]>sr) j--;
if (i<=j)
{
swap(tab[i],tab[j]);
i++;
j--;
}
}
if (l<j) qs(tab,l,j,pivot(tab,l,j)); // Tutaj jest problem
if (p>i) qs(tab,i,p,pivot(tab,i,p)); //I tutaj
}
int main()
{
double czas;
clock_t start,stop;
//Wczytywanie danych
scanf("%d",&n);
tab=new int[n];
for (i=0;i<n;i++) scanf("%d",&tab[i]);
x=pivot(tab,0,n-1);
//Wyświetlanie tablicy wejściowej
if (n<11)
{
for (i=0;i<n;i++) printf("%d ",tab[i]);
printf("\n");
}
//Mierzenie czasu sortowania qs
start=clock();
qs(tab,0,n-1,x);
stop=clock();
//Wyświetlanie tablicy wyjściowej
if (n<11)
{
for (i=0;i<n;i++) printf("%d ",tab[i]);
printf("\n");
}
//Wyświetlanie czasu
czas=(stop-start)/(double)CLOCKS_PER_SEC;
printf("%fs\n %d",czas,x);
//Usuwanie tablicy
delete [] tab;
return 0;
}