Heap Sort

Weiter gehts mit den C Übungen, jetzt ist der Heap Sort dran:

 
#include 
#define MAX 8

void heap_sort(int *liste);
void generate_MaxHeap(int *liste);
void versenke(int *liste, int i, int n);
void vertausche(int *liste, int i, int child);
void output(int *liste);

int main(int argc, char* argv[])
{
	
	int a[] = {15, 9, 12, 1, 6, 13, 3, 4};

	printf("+Start:     ");
	output(a);
	heap_sort(a);

	return 0;
}
void output(int *liste)
{
	int i=0;

	for(i=0; i0; i--)
	{
		vertausche(liste, i, 0);
		versenke(liste, 0, i);
	}
	printf("+Sortiert:  "); 
	output(liste);

}

void generate_MaxHeap(int *liste)
{
	// starte von Mitte rückwärts
	int i=0;
	for(i=MAX/2-1;i>=0;i--)
	{
		printf("   >> HEAP generieren Element [%d] -> [%d] n",i,liste[i]); 		
		versenke(liste, i, MAX);
	}
}

void versenke(int *liste, int i, int n)
{
	
	while(i <= (n/2)-1)
	{
		int child = ((i+1)*2)-1; // Linkes Blat

		//bestimmen ob rechtes Blatt existiert
		if (child + 1 <= n-1)
		{
			//rechtes Blatt existiert
			if(liste[child] < liste[child+1])
			{
				//wenn rechtes Blatt grösser ist, nimm das
				child++;
			}
		}

		//testen ob Element sinken muss
		if(liste[i] < liste[child])
		{
			//element versenken
			vertausche(liste, i, child);
			//wiederhole Vorgang mit der neuen Position		
			i = child;
		}
		else
		{
			break;
		}
		printf(" Versenke:  ");
		output(liste);

	}
}
void vertausche(int *liste, int i, int child)
{
	int z=liste[i];
	printf("   >> Tausche  [%d] mit  [%d] n",liste[i],liste[child]); 
	liste[i] = liste[child];
	liste[child] = z;
}