PRVI I DRUGI NA RANG LISTI- REŠENJE
Rešenje se sastoji u rekurzivnom ponavljanju funkcije kojoj se prosleđuju kao parametri trenutna pozicija koja se posmatra, niz i pokazivači na dva celobrojna podatka koji pamte trenutno največi i prvi sledeći po veličini. U toj funkciji se vrši poređenje trenutno najvećeg člana sa najvećim elementom u ostalom delu niza levo od trenutne pozicije. Ovo drugo se određuje rekurzivnim pozivom iste funkcije, ali se kao trenutna pozicija prosleđuje za 1 manja nego što je bila u prethodnom pozivu.
Ako ta funkcija vrati element koji je veći od trenutno upamćenog najvećeg, onda ta vrednost postaje najveća, a do tada najveće postaje druga po veličini.
U slučaju da u podnizu levo od tekuće pozicije najveći element ne bude veći od trenutno najvećeg, onda se proverava da nije možda veći od drugog po veličini. Ako jeste, onda novi drugi po veličini postaje upravo ta vrednost. U suprotnom nema promena.
Kao početne vrednosti za prvu i drugu najveću se u početku postavljaju vrednosti koje su sigurno manje od elemenata niza, i to su u ovom rešenju vrednosti -1, jer se ne očekuju negativne vrednosti u nizu.
Ako ta funkcija vrati element koji je veći od trenutno upamćenog najvećeg, onda ta vrednost postaje najveća, a do tada najveće postaje druga po veličini.
U slučaju da u podnizu levo od tekuće pozicije najveći element ne bude veći od trenutno najvećeg, onda se proverava da nije možda veći od drugog po veličini. Ako jeste, onda novi drugi po veličini postaje upravo ta vrednost. U suprotnom nema promena.
Kao početne vrednosti za prvu i drugu najveću se u početku postavljaju vrednosti koje su sigurno manje od elemenata niza, i to su u ovom rešenju vrednosti -1, jer se ne očekuju negativne vrednosti u nizu.
Takođe treba da naglasiti da se promenljive koje predstavljaju prvi i drugi najveći element niza (p i d) prosleđuju funkciji kao reference, a ne kao vrednosti, da bi se promene nad tim promenljivim unutar jednog od rekurentnih poziva funkcije zadržale i u drugim pozivima te funkcije i unutar glavne main funkcije, takođe. Ukoliko bi se parametri prosleđivali po vrednosti, onda bi promene važile samo u onoj funkciji ili pozivu u kojoj su nastale. Više prosleđivanju parametara funkciji po rednosti i reference možete pročitati na webstrani:
Funkcije u jeziku C
Funkcije u jeziku C
#include < stdio.h>
#include // Za INT_MIN
/*Funkcija koja se rekurzivno poziva i koja određuje najveću, kao i drugu po veličini vrednost*/
/*Parametri : pozicija u nizu, niz, pokazivači na prvi i drugi po veličini element*/
void dvaNajveca(int n,int A[], int *p,int *d)
{
int main() {
#include
using namespace std;
/*Funkcija koja se rekurzivno poziva i koja određuje najveću, kao i drugu po veličini vrednost*/
/*Parametri : pozicija u nizu, niz, pokazivači na prvi i drugi po veličini element*/
void dvaNajveca(int n,int A[], int *p,int *d)
{
if(n==0)
}
(*p)=INT_MIN; // Najmanja moguća vrednost za int
(*d)=INT_MIN; // Najmanja moguća vrednost za int
else(*d)=INT_MIN; // Najmanja moguća vrednost za int
dvaNajveca(n-1,A,p,d);//Odredjuje prvi i drugi najveći u podnizu levo od posmatrane pozicije
if(A[n-1] > (*p))
{
else if(A[n-1] > (*d))
{
if(A[n-1] > (*p))
{
(*d) = (*p);
(*p) = A[n-1];
}(*p) = A[n-1];
else if(A[n-1] > (*d))
{
(*d)=A[n-1];
}int main() {
int n,P,D;
scanf("%d",&n);
// Proveravamo da li je broj takmičara validan
if (n < 1 || n > 20000) {
int A[n];
for(int i = 0; i < n; i++)
{
dvaNajveca(n, A, &P, &D);
printf("%d\n",P);
printf("%d\n",D);
return 0;
}scanf("%d",&n);
// Proveravamo da li je broj takmičara validan
if (n < 1 || n > 20000) {
printf("Broj takmičara mora biti između 1 i 20000.\n");
return 1;
}return 1;
int A[n];
for(int i = 0; i < n; i++)
{
scanf("%d",&A[i]);
}dvaNajveca(n, A, &P, &D);
printf("%d\n",P);
printf("%d\n",D);
return 0;