Merge sort - stack overflow

0

Witam!
Miałem za zadanie napisać program wykonujący sortowanie przez scalanie przy użyciu vectorów i pomocniczego kontenera queue. Problem jest taki, jak w temacie. Po podaniu liczb, które mają zostać posortowane, wyskakuje błąd "stack overflow". Byłbym niezwykle wdzięczny za możliwie najszybszą pomoc. Muszę to zrobić jeszcze tej nocy. Dziękuję! :)

#include <iostream>
#include <vector>
#include <new>
#include <queue>

using namespace std;




vector<float> scalanie(vector<float> &liczby, vector<float> &lewy, vector<float> &prawy)
{
	 float lewy_p=0;
	 float prawy_p=0;

	queue<float> pom; //Kontener typu queue, który w tej funkcji będzie pełnił rolę pomocniczego kontenera.
	
	if (prawy_p < prawy.size())
	{
		pom.push(prawy[prawy_p]);
		prawy_p++;
	}
	if (lewy_p < lewy.size())
	{
		pom.push(lewy[lewy_p]);
		lewy_p++;
	}

	int rozpom = pom.size();


	while (lewy_p < lewy.size() && prawy_p < prawy.size())
	{
		if (lewy[lewy_p] >= prawy[prawy_p])
		{
			pom.push(prawy[prawy_p]);
			prawy_p++;
		}
		else
		{
		pom.push(lewy[lewy_p]);
		lewy_p++;
		}
	}


	vector<float>posortowane;
	for (int j = 0; j < rozpom; j++)
	{
		posortowane.push_back(pom.front());
		pom.pop();
	}
	return posortowane;
}


vector<float> podzial(vector<float> &liczby ) //Funkcja dzieli wektor na mniejsze, aż do jednowartościowych.
{
	if (liczby.size() != 1)
	{	
		vector<float>::iterator mid= liczby.begin() + ((1 / 2)*liczby.size());
		vector<float> liczby_lewy(liczby.begin(), mid);    //Tworzymy dwa wektory z wartościami będącymi odpowiednia pierwszą i drugą połową wektora "liczby".
		vector<float> liczby_prawy(mid, liczby.end());
		liczby_prawy = podzial(liczby_prawy);
		liczby_lewy = podzial(liczby_lewy);
		return scalanie(liczby,liczby_lewy,liczby_prawy);
	}
	else
	{
		return liczby;
	}
}

int main()
{
	vector < float > liczby;
	vector<float>posortowane;
	cout << "Podaj, ile liczb chcesz posortowac." << endl;

	int ilosc;
	cin >> ilosc;
	cout << "Podaj te liczby." << endl;

	float liczba;
	for (int i = 0; i < ilosc; i++)
	{
		cin >> liczba;	
		liczby.push_back(liczba);
	}
	system("pause");
	system("cls");
        liczby=podzial(liczby)

	cout << "Posortowane liczby: " << endl;
	for (int i = 0; i < ilosc; i++)
	{
		cout << liczby[i] << ' ';
		cout << "\n";
	}
	system("pause");

} 
1

Po 1 to nie jest mergesort. Funkcja scalania powinieneś wykonywać wracając z rekurencji dwóch podziałów, a nie tylko raz na koniec programu. Tu możesz więcej poczytać https://pl.wikipedia.org/wiki/Sortowanie_przez_scalanie
Po 2 czy czasem (1 / 2)*liczby.size()); nie jest zawsze równe 0 ?

3

Błąd masz co najmniej tu: liczby.begin() + ((1 / 2)*liczby.size());, bo za bardzo sobie życie komplikujesz.
1/2 jest równe zero (dzielenie całkowitoliczbowe!) - liczby.size() / 2 wystarczy.

3
  1. Po kiego do scalanie() przekazujesz vector<float> &liczby ? Może to powinno być wynikiem?
  2. Realizacja tego jest tak beznadziejna że .... sam zobacz:
void merge(vector<float> &ret,vector<float> &lf,vector<float> &rt)
  {
   ret.clear();
   ret.reserve(lf.size()+rt.size);
   split(lf);
   split(rt);
   vector<float>::iterator ilf=lf.begin(),irt=rt.begin();
   while((ilf!=lf.end())&&(irt!=rt.end())) if(*ilf<*irt) ret.push_back(*ilf++); else ret.push_back(*irt++);
   while(ilf!=lf.end()) ret.push_back(*ilf++); 
   while(irt!=rt.end()) ret.push_back(*irt++);
  }

i już, koniec kropka!
3. Ten podział nie jest lepszy .... sam zobacz:

void split(vector<float> &tb)
  {
   if(tb.size()<2) return;
   vector<float>::const_iterator mid=tb.begin()+(tb.size()>>1);
   merge(tb,vector<float>(tb.begin(),mid),vector<float>(mid,tb.end()));
  }

i już, koniec kropka!
Naprawdę nie chce mi się nawet na tego main'a patrzeć.

0

Bardzo dziękuję za pomoc! :) Już błędy zrozumiałem, będzie śmigać. :)

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