Witam.
Mam problem z implementacją algorytmu sortowania kopcowego, mianowicie mój kod czasami zwraca posortowane częściowo (co jakiś czas w wydruku pojawiają się wartości w dziwnych miejscach, coś w stylu (1,3,4,4,146,160,5,7,10.)
#include <stdio.h>
#include <stdlib.h>
//g-rodzic|g*2+1-lewy syn|g*2+2-prawy syn
void wier( int g, int wielkosc, int tab[])
{
int mak;
if ((g*2+2)<=wielkosc) //Jezeli nie jestesmy w ostatnim wezle, badz ostatni ma dwoch synow.
{
if(tab[g*2+1]>tab[g*2+2]) //Jezeli lewy syn jest wiekszy od prawego.
{
if(tab[g*2+1]>tab[g])//I Jeżeli jest wiekszy od rodzica.
{
mak=tab[g];
tab[g]=tab[g*2+1];
tab[g*2+1]=mak;
wier(g*2+1,wielkosc,tab);//Popraw w glab lewego syna.
}
}
else if(tab[g*2+1]<tab[g*2+2]) //Jezeli prawy syn jest wiekszy od lewego.
{
if(tab[g*2+2]>tab[g])//I jezeli jest wiekszy od rodzica
{
mak=tab[g];
tab[g]=tab[g*2+2];
tab[g*2+2]=mak;
wier(g*2+2,wielkosc,tab);//Popraw w glab prawego syna
}
}
}
else if((g*2+1)==wielkosc) //Jezeli jestesmy w ostatnim wezle i ostatni ma tylko jednego syna.
{
if(tab[g*2+1]>tab[g])//I jest on wiekszy od rodzica
{
mak=tab[g];
tab[g]=tab[g*2+1];
tab[g*2+1]=mak;
}
}
}
void kopcuj( int n, int tab[])
{
int a;
for(a=((n-1)/2); a>=0; a-=1) //Zaczynajac od ostatniego rodzica, do zerowego)
{
wier(a,n,tab);
}
}
void sort( int n, int tab[])
{
int tmp;
tmp=tab[0];
tab[0]=tab[n];
tab[n]=tmp; //zamien pierwszym element z ostatnim.
if(n>0)
{
wier(0,n-1,tab);//popraw pokrewienstwa, nie liczac ostatniego elementu tablicy jako kopca.
//wier(0,n-1,tab);//popraw pokrewienstwa, nie liczac ostatniego elementu tablicy jako kopca.
sort(n-1,tab);//Wywolaj sie rekurencyjnie dla mniejszego kopca
}
}
int main()
{
int n,t;
scanf("%i",&n); //pobierz liczbe elementow
int tab[n];
for(t=0; t<n; t+=1)
{
scanf("%i",&tab[t]); //pobieraj elementy
}
kopcuj(n-1,tab); //zrob z nich kopiec
sort(n-1,tab); // i posortuj go
for(t=0; t<n; t+=1)
{
printf("\n%i",tab[t]);
}
return 0;// // // // // // // 0
}
Początkowy fragment wydruku dla 100tys.
300080
323300
342751
414118
1716365491 //
1716365491 //
360861850 //
360861850 //
431231
441294
445515
451620
471514
526076
Oczywiście moje pytanie brzmi co robię źle (i dlaczego jestem niemal pewien, że robię dobrze).
'Błedy te nie pojawiają się zawsze.
Początkowo myślałem, że po prostu przekraczam zakres zmiennej ale przecież wszystkie generowane wartości mieszczą się w incie, a rozszerzenie do long longa w żaden sposób nie poprawia. (Co zresztą zdziwiłbym się, gdyby zadziałało.)
Pozdrawiam i z góry dziękuję za pomoc.