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 stogowe (heapsort) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 13
SłabyŚwietny
Nadesłany przez Marian, 22 października 2010 14:29
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.

heap_1_c.cpp:
/*
Mariusz Redwanz el_paso 6 119436 
HeapSort - sortowanie stogowe
www.algorytm.org
*/

#include<stdio.h>
#include<stdlib.h>
#include<math.h> // funkcja pow
#include<string.h> // funkcja strlen

struct liczba { // struktura przechowujaca dwie postacie wprowadzonej liczby
	char *ulamek; // postac ulamka
	double dziesietnie; // postac dziesietna 
};

/*******************************************************************************************/
void dodaj (int wielkosc, struct liczba tablica[]); // dodawanie kolejnych liczb
void heapsort (int wielkosc, struct liczba tablica[], struct liczba tab_sort[]); // sortowanie przez kopcowanie
void heapify (int wielkosc, struct liczba tablica[], int i); // przywracanie wlasnosci kopca
void build_heap (int wielkosc, struct liczba tablica[]); // budowa kopca
void wyswietl (int wielkosc, struct liczba tablica[]); // wyswietlenie elementow
void usun (int wielkosc, struct liczba tablica[], struct liczba tab_sort[]); // usuwanie elementow stworzonych dynamicznie
/*******************************************************************************************/

int main()
{
    int t, k; // liczba testow i ilosc liczb w tescie
    scanf("%d", &t); 
    while (t--)
    {
          scanf("%d", &k);  
		  struct liczba *tablica = (struct liczba *)malloc((k+1) * sizeof(struct liczba)); // tablica przechowujaca struktury z liczbami
		  struct liczba *tab_sort = (struct liczba *)malloc((k+1) * sizeof(struct liczba)); // posortowane elementy
		  dodaj (k, tablica);
		  build_heap (k, tablica);
		  wyswietl (k, tablica);
		  heapsort (k, tablica, tab_sort);
		  wyswietl (k, tab_sort);
		  printf("\n");
		  usun (k, tablica, tab_sort);
    } 
    return 0;
}
/*******************************************************************************************/
void dodaj (int wielkosc, struct liczba tablica[])
{
	int h, i, j, dlugosc;
	double wynik, liczba1, liczba2; 
	for (h = 1; h <= wielkosc; h++)
	{
		liczba1 = 0; 
        liczba2 = 0;
		char *wejscie = (char *)malloc(16 * sizeof(char)); // wczytywanie ulamka jako ciag znakow 
		scanf("%s", wejscie);
		dlugosc = strlen(wejscie);
		for (i = dlugosc-1, j = 0; wejscie[i] != '/'; i--, j++) // zamiana znakow na liczby
			liczba2 += (wejscie[i]-'0')*pow(10.0, j); 
		for (i--, j = 0; i > 0; i--, j++) 
			liczba1 += (wejscie[i]-'0')*pow(10.0, j);
		if (wejscie[0] == '-') liczba1 *= (-1); // jesli minus przed liczba
		else liczba1 += (wejscie[i]-'0')*pow(10.0, j); // jesli bez minusa
		wynik = liczba1/liczba2; // zapis ulamka w postaci dziesietnej
		struct liczba *nowa = (struct liczba *)malloc(sizeof(struct liczba)); // zapis do struktury 
		tablica[h] = *nowa;
		tablica[h].dziesietnie = wynik;
		tablica[h].ulamek = wejscie;
	}
}
/*******************************************************************************************/
void heapify (int wielkosc, struct liczba tablica[], int i)
{
	int min, left = 2*i, right = 2*i+1;
	if ((left <= wielkosc) && (tablica[left].dziesietnie < tablica[i].dziesietnie)) min = left;
	else min = i;
	if ((right <= wielkosc) && (tablica[right].dziesietnie < tablica[min].dziesietnie)) min = right;
	if (min != i) // nie ma wlasnosci kopca
	{
		tablica[0] = tablica[i];
		tablica[i] = tablica[min];
		tablica[min] = tablica[0];
		heapify (wielkosc, tablica, min);
	}
}
/*********************************************************************************************************/
void build_heap (int wielkosc, struct liczba tablica[])
{
	int i;
	for (i = wielkosc/2; i > 0; i--) 
		heapify (wielkosc, tablica, i);
}
/*********************************************************************************************************/
void heapsort (int wielkosc, struct liczba tablica[], struct liczba tab_sort[])
{
	int i, j;
	for (i = wielkosc, j = 1; i > 1; i--, j++) 
	{
		tab_sort[j] = tablica[1];
		tablica[1] = tablica[i];
		wielkosc--;
		heapify (wielkosc, tablica, 1);
		wyswietl (wielkosc, tablica);
	}
	tab_sort[j] = tablica[1];
}
/*******************************************************************************************/
void wyswietl (int wielkosc, struct liczba tablica[])
{
	int j;
	for (j = 1; j <= wielkosc; j++) 
		printf("%s ", tablica[j].ulamek);
	printf("\n");
}
/*******************************************************************************************/
void usun (int wielkosc, struct liczba tablica[], struct liczba tab_sort[])
{
	free (tablica);
	free (tab_sort);
}
/*******************************************************************************************/
Dodaj komentarz