A)
Implementirajte 2 verzije HeapSort algoritma koristeći rekurzivnu i
iterativnu verziju funkcije Heapify.
Pseudokod
Heapify(array A,int i,int m);
l=2*i+1
r=2*i+2
max=i
if(l<=m and A[l]>A[max])
max=l
if(r<=m and A[r]>A[max])
max=r
if(max!=i)
swap A[i] with A[max]
Heapify(A,max,m)
Heapify2(array A,int i,int m)
max=i
while(max<=m)
l=2*max+1
r=2*max+2
i=max
if(l<=m and A[l]>A[i])
max=l
else
max=i
if(r<=m and A[r]>A[max])
max=r
if (i!=max)
Swap A[i]
with A[max]
else
return
BuildHeap(int n,array A[1..n])
for i=n/2 to 1
Heapify(A,i,n)
HeapSort(int n,array A[1..n])
BuildHeap(n,A)
m=n
while(m>=2)
swap A[1] with A[m]
m=m-1;
Heapify(A,1,m)
B)
Pokrenite iterativnu i rekurzivnu verziju heap sorta za npr. 3000000 elemenata te ispišite njihova vremena izvršavanja. Koja verzija je brža?
Implementirajte bubble sort te ispišite njegovo vrijeme izvršavanja za npr. 50000 elemenata.
Za vrijeme izvršavanja korisitite funkciju
int GetTickCount(void);
koja vraća koliko milisekundi je prošlo od trenutka pokretanja sustava.
Npr:
vrijeme1=GetTickCount();
HeapSort(size-1,A);
vrijeme2= GetTickCount();
Vrijeme izvršavanja Heap sorta je: vrijeme2-vrijeme1
Pseudokod za bubble sort:
for i=0 to size-1
for j=i+1 to size
if(A[i]>A[j])
Swap(A[i],A[j])
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
int fast=0;
void Swap(int A[],int i, int j)
{
int temp;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
void Heapify(int A[],int i,int m)
{
int max,l,r;
l=2*i+1;
r=2*i+2;
max=i;
if((l<=m)&&(A[l]>A[max]))
max=l;
if((r<=m)&&(A[r]>A[max]))
max=r;
if(max!=i)
{
Swap(A,i,max);
Heapify(A,max,m);
}
}
void Heapify2(int A[],int i,int m)
{
int l,r;
int max=i;
while ( max <=m )
{
l=2*max+1;
r=2*max+2;
i=max;
if ((l <= m) && (A[l] > A[i]))
max=l;
if ((r <= m) && (A[r] > A[max]))
max=r;
if (max != i)
Swap (A,i,max);
else
return;
}
}
void BuildHeap(int n,int A[])
{
int i;
for (i=n/2;i>=0;i--)
if (fast==0)
Heapify(A,i,n-1);
else
Heapify2(A,i,n-1);
}
void HeapSort(int n,int A[])
{
int m,temp;
BuildHeap(n,A);
m=n;
while(m>=1)
{
temp=A[0];
A[0]=A[m];
A[m]=temp;
m=m-1;
if (fast==0)
Heapify(A,0,m);
else
Heapify2(A,0,m);
}
}
void BubbleSort(int size,int A[])
{
// implementirajte bubble sort
}
int main()
{
FILE *file1,*file2;
char c;
int vrijeme1,vrijeme2,i,size;
printf("0)rekurzivno\n1)iterativno\n");
scanf(" %d",&fast);
printf("Unesi velicinu niza\n");
scanf(" %d", &size);
int *A=(int*)malloc(size*sizeof(int));
for(i=0;i<size;i++)
A[i]=rand();
//pokreni heap sort, ispiši vrijeme sortiranja
printf("vrijeme je %d\n",vrijeme2-vrijeme1);
file1 = fopen( "OutputHeap.txt", "w" );
for(i=0;i<size;i=i++)
fprintf(file1, "%d\n",A[i]);
fclose(file1);
for(i=0;i<size;i++)
A[i]=rand();
printf("BubbleSort?(y/n)\n");
c=getch();
if(c=='y')
{
//pokreni bubble sort i ispiši njegovo vrijeme izvršavanja
file2 = fopen( "OutputBubble.txt", "w" );
for(i=0;i<size;i=i++)
fprintf(file2, "%d\n",A[i]);
fclose(file2);
}
free(A);
return 0;
}