witam ,mam bardzo proste pytanie dotyczące algorytmu merge sort a dokładnie funkcji łączącej dwa posortowanie zbiory (tylko ją podałem) . Problem dokładnie dotyczy sytuacji kiedy musimy przepisać resztę (pozostałe) elementy z tablicy . Teorytycznie trzeba to zrobić wtedy kiedy jeden zbiór jest dłuższy od drugiego lub kiedy pozostały w nim jakieś elemnty . Zanim może dokładnie powiem co mam na myśli podam cały kod funkcji:
void merge(int *tablica ,int start, int srodek, int koniec) {
int *tab_pom = new int[(koniec-start)];
int i = start, j = srodek+1, k = 0;
while(i<=srodek && j<=koniec) {
if(tablica[i]<tablica[j]) {
tab_pom[k]=tablica[i];
i++;
} else {
tab_pom[k]=tablica[j];
j++;
}
k++;
}
if(i<=srodek) { //czemu tak ? <=
while(i<=srodek) {
tab_pom[k]=tablica[i];
i++;
k++;
}
} else {
while(j<=koniec) {
tab_pom[k]=tablica[j];
j++;
k++;
}
}
for(int i=0; i<=koniec-start; i++)
tablica[start+i] = tab_pom[i];
}
a zwłaszcza tego fragmentu :
if(i<=srodek) { //tego nie rozumiem : <= a nie <
while(i<=srodek) { //przepisywanie pozostałych elementow
tab_pom[k]=tablica[i];
i++;
k++;
}
} else {
}
czemu występuje tu warunek i<=srodek a nie po prostu i<srodek ,gdy dam tą drugą opcje to algorytm nie działa ok . Przecież przepisujemy wartości tylko wtedy kiedy jeszcze zostały jakieś elementy a nie kiedy "wskaźnik" jest równy końcowemu elementowi . Wiem że pytanie może się wydawać ne jasne ,jak coś to dajcie znać . Z góry dziękuje za pomoc i dotrwanie do końca :)