Napisalem sortowanie przez kopcowanie, na podstawie pseudokodu z Cormena, program sie kompiluje, ale nie dziala najlepiej tj. wszystko jest ok, nie liczac tego, ze czasami pierwszy i drugi element tablicy jest odwrotnie posortowany, pozostale ok. Co tu jest nie tak? Jak pozbyc sie zmiennej globalnej? Czy sa jeszcze jakies bledy, nieoptymalne rozwiazania?
z gory dzieki za pomoc
#include <stdio.h>
#include <time.h>
#define N 10
//Sortowanie przez kopcowanie
int parent(int i){return i/2;};
int left(int i){if(i==0)return 1; else return 2*i;};
int right(int i){if(i==0)return 2; else return 2*i+1;};
void heapify(int t[], int i);
void build_heap(int t[]);
void heapsort(int t[]);
int heap_size = N; //jak pozbyc sie globalnej, a czy heap_size ma nie byc wyrazony przypadkiem za pomoca funkcji? bo w Cormenie pisalo //heap_size[t]? jeżeli tak to jak to zrobic?
int main(){
srand(time(0));
int t[10];
int i=0;
for (i=0;i<N;++i)
t[i]=rand()%12;
for (i=0;i<N;++i)
printf("%d\t", t[i]);
heapsort(t);
printf("\n\n\n");
for (i=0; i<N;++i)
printf("%d\t", t[i]);
return 0;
}
void heapify(int t[], int i){
int largest;
int l = left(i);
int r = right(i);
if (l<heap_size && t[l] > t[i])
largest = l;
else
largest = i;
if (r< heap_size && t[r] > t[largest])
largest = r;
if (largest != i){
int x;
x=t[i];
t[i]=t[largest];
t[largest]=x;
heapify(t, largest);
}
}
////////////////////////////////////////////////////////////////////////
void build_heap(int t[]){
heap_size=N;
int i;
for (i=N/2; i>=0; --i)
heapify(t,i);
}
/////////////////////////////////////////////////////////////////////////
void heapsort(int t[]){
build_heap(t);
int i;
for (i=N; i>=1; --i){
int x=t[0];
t[0]=t[i];
t[i]=x;
heap_size=heap_size-1;
heapify(t,0);
}
}