Sortowanie przez scalanie - funkcja

0

Hej, mam taką funkcję do sortowania przez scalanie, ale z jakiegoś powodu nie działa. Czy ktoś pomógłby mi wychwycić błąd? Byłbym wdzięczny :)

double* pomoc;

void sortuj_przez_scalanie(double* tablica, int lewy_indeks, int prawy_indeks)
{
	// tu nalezy zaimplementowac sortowanie tablicy przez scalanie (ang. merge sort)

	if (lewy_indeks >= prawy_indeks) return;

	int srodek = (lewy_indeks + prawy_indeks) / 2;

	sortuj_przez_scalanie(tablica, lewy_indeks, srodek);
	sortuj_przez_scalanie(tablica, srodek++, prawy_indeks);

	int i = lewy_indeks;
	int j = srodek++;


	for (int k = lewy_indeks; k <= prawy_indeks; k++) {
		pomoc[k] = tablica[k];
	}

	for (int k = lewy_indeks; k <= prawy_indeks; k++) {
		if (i <= srodek) {
			if (j <= prawy_indeks) {
				if (pomoc[j] < pomoc[i]) {
					tablica[k] = pomoc[j++];
				}
				else {
					tablica[k] = pomoc[i++];
				}
			}
			else {
				tablica[k] = pomoc[i++];
			}
		}
		else {
			tablica[k] = pomoc[j++];
		}
	}

	delete[] pomoc;

}
0

"Nie działa" – jaki jest błąd?

0

@Silv:

0

Moje uwagi, niezwiązane z błędem, ale może pomogą:

// tu nalezy zaimplementowac sortowanie tablicy przez scalanie (ang. merge sort)

Usunąłbym (jeśli to możliwe w zadaniu). Niby tylko komentarz, ale moim zdaniem rozprasza, jak patrzy się na kod.

if (lewy_indeks >= prawy_indeks) return;

Zapisałbym to tak:

if (lewy_indeks >= prawy_indeks) {
  return;
}
sortuj_przez_scalanie(tablica, srodek++, prawy_indeks);

Jaki jest cel takiego zapisu w tym miejscu: srodek++?

int j = srodek++;

Zapisałbym to tak:

int j = srodek;
++srodek;

(Chociaż nie jestem pewien, czy w ogóle zmienna srodek powinna być zwiększana).

pomoc[j++]; – (wszystkie cztery wystąpienia) nie jest to najbardziej czytelne. Z tego, co pamiętam z C++, najpierw następuje indeksowanie, a potem inkrementacja. Zapisałbym w dwóch oddzielnych wyrażeniach: pomoc[j] oraz ++j. (Ponownie, nie wiem, czy to poprawny kod, po prostu zapisałem tę samą funkcjonalność inaczej).


UPDATE:

  1. Niepokoi mnie trochę obecność operatora delete[] bez obecności operatora new.
  2. Nie spotkałem się jeszcze z tym, by używać operatora delete[] w funkcji wywoływanej rekurencyjnie. Ale jak mówię, C++ nie znam (za dobrze).

UPDATE2:

  1. Spotkałem się z tym, że procedurę scalania* zapisuje się w oddzielnej funkcji. Jeśli masz możliwość (bo może zadanie wymaga jednej funkcji), to spróbuj napisać drugą funkcję. Jeśli nie, możesz tylko dla zrozumienia algorytmu tak zrobić. Może będzie prościej. Tutaj masz przykład: https://edu.pjwstk.edu.pl/wyklady/asd/scb/asd04/main04_p5.html

* Nie umiem powiedzieć Ci, który to dokładnie kod u Ciebie.

0
Silv napisał(a):

Moje uwagi, niezwiązane z błędem, ale może pomogą:

if (lewy_indeks >= prawy_indeks) return;

Zapisałbym to tak:

if (lewy_indeks >= prawy_indeks) {
  return;
}

Czytelność kodu, można określić jako czas potrzebny na przeczytanie tego kodu.
Ponieważ taki kod czyta się z prędkością kręcenia rolki myszki to zmniejszyłeś czytelność tego fragmentu trzykrotnie.

int j = srodek++;

Zapisałbym to tak:

int j = srodek;
++srodek;

Doprawdy? Znowu proponujesz zmniejszenie czytelności? Powiedz mi proszę po kiego twórcy C wymyślili ten operator i++?

@thebegginer pierwszy z brzegu błąd - zwiększasz srodek dwukrotnie.

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