Sortowanie przez scalanie - błąd w kodzie

0

Próbuje napisać algorytm sortowania przez scalanie, i zrobiłem gdzieś jakiś błąd w rozumieniu i nie mogę go znaleźć, bo według mnie jest to dobrze zrobione ! no ale nie działa więc nie jest. Jeśli jest ktoś na tyle dobry w tym, żeby znaleźć na szybko błąd to pomógłby mi i napisał co jest źle ?

#include <conio.h>
#include <iostream>

using namespace std;

template <class C>
// 2 5 3 5 6 1 4 9
// 2 5 3 5 6       1 4 9
// 2 5 3     5 6       1 4    9
// 2 5    3     5 6       1 4    9
//	int tab[] = { 2, 5, 3, 5, 6, 1, 4, 9 };
// 1 2 3 4 5 5 6 9
// Merge_Sort<int>(tab, 0, 4, 7);
void Merge_Sort(C tab[], int p, int q, int r)
{
	int n1 = q - p + 1;
	int n2 = r - q;
	int* tab1 = new int[n1];
	int* tab2 = new int[n2];
	int a = p;
	for (int i = 0; i < n1; i++)
	{
		tab1[i] = tab[a];
		a++;
	}
	for (int i = 0; i < n2; i++)
	{
		tab2[i] = tab[a];
		a++;
	}
	if (n1>2)Merge_Sort(tab1, 0, (int)(n1 / 2), n1 - 1) ;
	if (n2>2)Merge_Sort(tab2, 0, (int)(n2 / 2), n2 - 1) ;
	int o = 0;
	int y = 0;
	
	for (int i = p; i < r; i++)
	{
		if (tab1[o] <= tab2[y] && o<n1) { tab[i] = tab1[o]; o++; }
		else if (tab1[o] >= tab2[y] && y < n2) { tab[i] = tab2[y]; y++; }
	}
	for (int i = 0; i < r - p + 1; i++)
	{
		cout << tab[i] << " ";
	}
	cout << endl;
		delete[] tab1;
		delete[] tab2;
		
}

int main()
{
	int tab[] = { 2, 5, 3, 5, 6, 1, 4, 9 };
     Merge_Sort<int>(tab, 0, 4, 7);
	getch();
	return 0;
}

EDIT:
Wiem już, że jest coś nie tak z pętlą scalającą jak powinna ona wyglądać w tym przypadku ?

dodanie znacznika <code class="cpp"> - Furious Programming

1

ktoś na tyle dobry w tym, żeby znaleźć na szybko błąd

Ten ktos ma na imie Debugger i jesli myslisz o programowaniu, proponuje go czym przedzej odwiedziec. Debuggery zazwyczaj nie znosza samotnosci.

Btw. Jednoliterkowe nazwy zmiennych skutecznie mnie odstraszyly od zaglebiania sie w to, ale ta funkcja w tej postaci na pewno nie powinna byc szablonowa.

0

EDIT:
Napisałem głupoty xd za późno, przydałby się jakiś tutorial do debugera z visuala bo nie wiem jak to działa :P

0

Błąd jest tutaj:

if (n1>2)Merge_Sort(tab1, 0, (int)(n1 / 2), n1 - 1) ;

po zmianie na:

if (n1>2)Merge_Sort(tab1, 0, (int)(n1 / 2)-1, n1 - 1) ;

działa. Ale nie wiem jak będzie dla innych danych. Prześledź to sam.

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