quick sort stack

0

Witam mam błąd w algorytmie quick sortu, otóż niektóre dane sortuje ok ale przy niektórych wyskakuje Stack overflow, teraz wyskoczył przy 300 tys danych, czy jest możliwe ze jest za dużo zagłębień rekurencyjnych?? Aczkolwiek wydaje mi się ze pamięci starcza :/ mój algorytm:

 int quick_sort_chg(int to_sort[], int begin, int end, bool random_key)
{
    int x, key;
	if(!random_key)
		x=to_sort[begin];
	else
	{
		key=rand()%(end-begin+1)+begin;
		x=to_sort[key];
	}
	//x=to_sort[begin];
    while(true)
    {
         while(to_sort[end]>x)
             end--;
         while(to_sort[begin]<x)
             begin++;
         if(begin<end)
         {
             int tmp=to_sort[begin];
             to_sort[begin]=to_sort[end];
             to_sort[end]=tmp;
             begin++;
             end--;
         }
         else
             return end;
    }
}

void quick_sort_rec(int to_sort[], int begin, int end, bool random_key)
{
    if(begin<end)
    {
        int x = quick_sort_chg(to_sort, begin, end, random_key);
        quick_sort_rec(to_sort, begin, x, random_key);
        quick_sort_rec(to_sort, x+1, end, random_key);
    }
}
0

piszę z pamięci więc może być błąd, ale idea jest taka:

void quick_sort_rec(int to_sort[], int begin, int end, bool random_key)
{
    while(begin != end)
    {
        int pivot = quick_sort_chg(to_sort, begin, end, random_key);
        // sprawdzamy która część jest mniejsza
        if (pivot - begin < end - pivot)
        {
               // mniejsza połowa rekurencyjnie
               quick_sort_rec(to_sort, begin, pivot, random_key);
               // większa połowa w następnym przebiegu pętli while
               begin = pivot+1;
        }
        else
        {
               quick_sort_rec(to_sort, x+1, end, random_key);
               end = pivot;
        }
    }
}

zakładam że end wskazuje na element za ostatnim elementem interesującego nas zbioru — bo tak powinno się pisać algorytmy ;-)

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