C++ QuickSort (wywołanie funkcji w funkcji)

0

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;
}
0

Namieszałeś z tymi zmiennymi globalnymi i w ogóle dziwnie to wszystko wygląda. Podejrzewam, że sypie się sama funkcja pivot(). Licznik pętli i jako zmienna globalna to tak fatalny pomysł, że brakuje mi słów...

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