algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Sortowanie przez scalanie (mergesort) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 41
SłabyŚwietny
Nadesłany przez Marian, 20 lutego 2011 13:08
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

merge_1_c.cpp:
// sortowanie przez scalanie (mergesort)
// www.algorytm.org

#include<iostream>
using namespace std;

void merge(int tablica[], int start, int srodek, int koniec)
{
	int *tab_pom = new int[(koniec-start)]; // utworzenie tablicy pomocniczej
	int i = start, j = srodek+1, k = 0; // zmienne pomocnicze

	while (i <= srodek && j <= koniec) 
	{
		if (tablica[j] < tablica[i])
		{
			tab_pom[k] = tablica[j];
			j++;
		}
		else
		{
			tab_pom[k] = tablica[i];
			i++;
		}
		k++;
	}
 
	if (i <= srodek)
	{
		while (i <= srodek)
		{
			tab_pom[k] = tablica[i];
			i++;
			k++;
		}
	}
	else
	{
		 while (j <= koniec)
		 {
			  tab_pom[k] = tablica[j];
			  j++;
			  k++;
		 }
	}
 
	for (i = 0; i <= koniec-start; i++)
		tablica[start+i] = tab_pom[i];  

	cout << endl;
	for (i = start; i <= koniec; i++) // wypisanie posortowanej tablicy
		cout << "tablica[" << i << "] = " << tablica[i] << endl;
}

void merge_sort(int tablica[], int start, int koniec)
{
	int srodek;

	if (start != koniec)
	{
		srodek = (start + koniec)/2;
		merge_sort(tablica, start, srodek);
		merge_sort(tablica, srodek+1, koniec);
		merge(tablica, start, srodek, koniec);
	}
}

int main()
{
	int ilosc_liczb, i;
	cout << "Podaj ilosc licz do posortowania: ";
	cin >> ilosc_liczb;

	int *tablica = new int [ilosc_liczb]; // tablica zawierajaca ciag wejsciowy

	for (i = 0; i < ilosc_liczb; i++) // wczytywanie liczb do tablicy
	{
		cout << "Podaj liczba: ";
		cin >> tablica[i];
	}

	merge_sort(tablica, 0, ilosc_liczb-1);

	cout << endl << "wynik:" << endl;
	for (i = 0; i < ilosc_liczb; i++) // wypisanie posortowanej tablicy
		cout << "tablica[" << i << "] = " << tablica[i] << endl;

	// zwolnienie tablic zaalokowanych dynamicznie
	delete [] tablica; 

    return 0;
}
Komentarze
photo
+5 # Tobi 2012-11-09 13:33
Nie zwolniles tablicy zaalokowanej w funkcji merge.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+13 # Jaczo 2013-12-18 21:34
U mnie czasem wywalało błąd. Okazało się, że tab_pom była o jeden element za krótka. Zmieniłem na (koniec - start +1) i jest ok
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz