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