MergeSort z użyciem wektorów C++

0

Cześć i czołem. Mam mały problem z funkcją Merge Sort, a mianowicie taki, że nie chce sortować :/ Albo wyświetla po prostu sam wektor bez sortowania, albo pozmienia kompletnie losowo kolejność, albo w ogóle zmieni wartość jakiegoś elementu na 0. Co jest w tym kodzie nie tak?

Dodam jeszcze, że w mainie proszę użytkownika o podanie długości wektora i przypisuje mu wartości całkowicie losowo, ale nie wiem w sumie czy będzie to miało jakiś związek. Posiłkowałem się wieloma stronami, na których były kody tego sortowania, ale żaden sposób nie zadziałał.
Dalibyście radę mnie chociaż naprowadzić na znalezienie błędu?

Pozdrawiam! :D

void Merge(vector<int>& tablica, int lewy,int srodkowy, int prawy)
{
	vector<int> tablica_pomocnicza;
	int i=lewy;
	int j=srodkowy+1;
	if(i<=srodkowy)
	{
		if(j<=prawy)
		{
			if(tablica[i]<tablica[j])
			{
				tablica_pomocnicza.push_back(tablica[i]);
				i+=1;
			}
			else
			{
				tablica_pomocnicza.push_back(tablica[j]);
				j+=1;
			}
		}
		else
		{
			tablica_pomocnicza.push_back(tablica[i]);
			i+=1;
		}
	}
	else
	{
		tablica_pomocnicza.push_back(tablica[j]);
		j+=1;
	}
	for(i=0;i<prawy-lewy-1;i++)
	{
		tablica[lewy+i]=tablica_pomocnicza[i];
	}
}

void MergeSort(vector<int>& tablica, int lewy, int prawy)
{
	
	if(lewy!=prawy)
	{
		int srodkowy=(lewy+prawy)/2;
		MergeSort(tablica, lewy, srodkowy);
		MergeSort(tablica,srodkowy+1,prawy);
		Merge(tablica,lewy,srodkowy,prawy);
	}
}
0

Moja wersja rekurencyjna:

std::vector<int> mergeVectors(const std::vector<int> &a, const std::vector<int> &b)
{
    std::vector<int> result;
    result.reserve(a.size() + b.size());

    auto b1 = a.begin();
    auto b2 = b.begin();
    while (b1 != a.end() && b2 != b.end()) {
         result.push_back(*b1 < *b2 ? *b1++ : *b2++);
    }

    while (b1 != a.end()) {
         result.push_back(*b1++);
    }

    while (b2 != b.end()) {
         result.push_back(*b2++);
    }

    return result;
}

std::vector<int> mergeSorted(const std::vector<int> &v)
{
     if (v.size() <= 1) return v;
     auto midle = v.begin() + std::size() / 2;
     auto left = mergeSorted({ v.begin(), midle });
     auto rigth = mergeSorted( { midle, v.end() });
     return mergeVectors(left, rigth);
}

Teraz popatrz na swoje Merge i porównaj z moim mergeVectors. Masz coś za mało pętli (tylko jedną, a u mnie są trzy)!

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