2nd largest

Résolu
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 - Modifié le 1 nov. 2022 à 12:09
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 - 1 nov. 2022 à 16:37

En attendant la possibilité d'envoyer un commentaire relatif à un code publié par un membre de CCM-CS, voici ce que je peux proposer suite à l'envoi de Lindb effectué ce jour : 2022-10-24.

#include <iostream>
    
void secondLargest(int *a, int nba, int *largest, int *second) {
    int premier = a[0];
    for(int i=1; i<nba; i++) if(a[i]>premier) premier=a[i];
    *largest = premier;
    int suivant = a[0];
    for(int i=1; i<nba; i++) if((a[i]>suivant)&&(a[i]!=premier)) suivant=a[i];
    *second = suivant;
}
       
int main() {
    int x[] = {22, 42, 75, 62, 49, 28, 37, 15, 39};
    int prem, deux;
    secondLargest(x, sizeof(x)/sizeof(int), &prem, &deux);
    std::cout << prem << "   " << deux << std::endl;
    getchar();
    return 0;
}


Ce n'est qu'un exemple. D'autres variantes sont possibles.
Et cette fois-ci avec la nouvelle méthode pour insérer les balises.
Bien cordialement, pgl10

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
1 nov. 2022 à 12:08

Bonjour !

Une petite modification pour éviter deux tours de boucles:

void secondLargest(int *a, int nba, int *largest, int *second) {
  if (nba < 2) {
    *largest = -1;
    *second = -1;
  }

  if (a[0] < a[1]) {
    *largest = a[1];
    *second = a[0];
  } else {
    *largest = a[0];
    *second = a[1];
  }

  for (int i = 2; i < nba; ++i) {
    if (a[i] > *largest) {
      *second = *largest;
      *largest = a[i];
    } else if (a[i] > *second) {
      *second = a[i];
    }
  }
}

En C++, on utiliserait un std::vector et on retournerait un std::pair. Une manière plus générique encore, serait de passer des itérateurs.

La version la plus propre serait d'utiliser https://en.cppreference.com/w/cpp/algorithm/nth_element qui fait exactement cela !

0
pgl10 Messages postés 380 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 29 octobre 2023 11
1 nov. 2022 à 16:37

Bonjour CptPingu,
bonjour tous,
                  
Merci beaucoup pour cet envoi ayant une meilleure efficacité.
Et merci aussi pour les indications complémentaires.
          
Entre temps l'envoi de Lindb du 24 octobre dans le forum de CCM-CS
a disparu, mais l'intérêt de cette réponse reste entier.
            
Le C++ a tellement possibilités qu'il est très formateur de voir
des exemples comme celui-ci.
    


0
Rejoignez-nous