IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Algorithme de tri


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut Algorithme de tri
    Bonjour à tous....
    Je debute en C...Et je dois effectuer un tri alpha numérique sur un tableau de caractere tres grand....
    Pouvez vous m'aiguiller sur un algorithm simple (à la relecture du code) et ne demandant pas trop de temps...

    Merci d'avance à vous.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    man qsort ..

  3. #3
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Pour les algorithmes de tri va voir ici

  4. #4
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Par défaut
    il y a le tri rapide (quick sort)
    le tri par insertion
    le tri par selection
    le tri sequenciel
    le tri par permutation

    il suufit de voir sur google, il ya des algorithmes tout fait pour ça

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu trouveras des exemples de code sur DVP ici

  6. #6
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Bonjour;
    En faite je souhaite trier un tableau de tableau de char avec Qsort...voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    static int compare (void const *a, void const *b)
    {
       /* definir des pointeurs type's et initialise's
          avec les parametres */
       char const *const *pa = a;
       char const *const *pb = b;
     
       /* evaluer et retourner l'etat de l'evaluation (tri croissant) */
       return strcmp (*pa, *pb);
    }
     
    int main (void)
    {
    /* tableau a trier (tableau de pointeurs sur char const) */
       t_MonTab tab[100];    /*mon tableau est initialisé plus haut dans une boucle for*/
       /*t_MonTab et un type déclarer en char [12]*/
       /*j'ai donc un tableau de 100 chaine de caractere (chaque chaine pouvant faire 12  
       caractere*/
     
       qsort (tab, sizeof tab / sizeof *tab, sizeof *tab, compare);
     
    /* affichage du tableau apres le tri */
       aff (tab, sizeof tab / sizeof *tab);
     
       return 0;
    }
    A la compile ca passe tres bien mais à l'exécution ca plante sur la ligne Qsort...en fait en regardans bien l'aide http://emmanuel-delahaye.developpez.com/qsort.htm
    il déclare:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char const *tab[] = { "world", "hello", "wild" };
    mais moi je ne peut pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    t_MonTab *tab[100];
    Ca plante à la compile ...
    help please

  7. #7
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Donne nous le code en entier s'il te plait
    que l'on puisse compiler

  8. #8
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    j'ai trouvé en fait il faut déclarer un *tab et faire un malloc....
    C'etait pas tres dure...enfin je code le source final des que j'ai debugger

  9. #9
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Donc comme promis voici mon source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
            char c[12];
    } T_type;
     
     
     
    /* fonction utilisateur de comparaison fournie a qsort() */
    static int compare (void const *a, void const *b)
    {
       /* definir des pointeurs type's et initialise's
          avec les parametres */
       char const *const *pa = a;
       char const *const *pb = b;
     
       /* evaluer et retourner l'etat de l'evaluation (tri croissant) */
       return strcmp (*pa, *pb);
    }
     
     
    /* affichage du tableau */
    static void aff (char const **a, size_t n)
    {
       size_t i;
       for (i = 0; i < n; i++)
       {
          printf ("%s\n", a[i]);
       }
       printf ("\n");
    }
     
     
    int main(int argc, char *argv[])
    {
     
      /* tableau a trier (tableau de pointeurs sur char const) */
       //char const *tab[] = { "100", "300", "200" };
     
       int *p = malloc(10*sizeof(int));
       T_type const *tab[4];
       *tab = malloc(4*sizeof(T_type));
     
       strcpy(tab[0], "c");
       strcpy(tab[1], "b");
       strcpy(tab[2], "a");
     
    /* affichage du tableau dans l'etat */
       aff (tab, sizeof tab / sizeof *tab);
     
       qsort (tab, sizeof tab / sizeof *tab, sizeof *tab, compare);
     
    /* affichage du tableau apres le tri */
       aff (tab, sizeof tab / sizeof *tab);
     
     
     
      system("PAUSE");	
     
     
     
      return 0;
    }
    en fait ca compile ca m'affiche dans la console:
    et non
    et en plus j'ai une erreur d'execution: "la memoire ne peut etre read...
    Quelqu'un peut m'aider?

  10. #10
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    j'ai trouvé la taille du tableau n'est pas bonne ce n'est pas 4 mais 3

  11. #11
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,
    Citation Envoyé par Jayceblaster Voir le message
    j'ai trouvé la taille du tableau n'est pas bonne ce n'est pas 4 mais 3
    -Avant que j'oublie il faut inclure "string.h" !
    -Le prototype de ta fonction 'aff' ne correspond pas aux appels que tu fais depuis ton main le premier paramètre doit être de type 'T_type' et non 'char' ...
    -L'allocation du tableau n'est pas jolie jolie ...voici une façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
       T_type *tab[4];
       size_t i;
       for( i=0;i<4;i++ )
       {
       		tab[i] = malloc(sizeof *tab[i] );
    		if( tab[i]==NULL )
    		{	/* Erreur d'allocation on libere tout ...*/
    			do
    			{
    				free( tab[i] );
    				tab[i]=NULL;
    				i--;
    			}while(i>=0);
    		}
       }
    -La fonction compare n'est pas bonne non plus il ne faut pas oublier que tu as encapsulé ta chaine de caracteres dans une structure !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    static int compare (void const *a, void const *b)
    {
       /* definir des pointeurs type's et initialise's
          avec les parametres */
       T_type const *const *pa = a;
       T_type const *const *pb = b;
     
       /* evaluer et retourner l'etat de l'evaluation (tri croissant) */
       return strcmp ((*pa)->c, (*pb)->c);
    }

    @++

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    -L'allocation du tableau n'est pas jolie jolie ...voici une façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
       T_type *tab[4];
       size_t i;
       for( i=0;i<4;i++ )
       {
       		tab[i] = malloc(sizeof *tab[i] );
    		if( tab[i]==NULL )
    		{	/* Erreur d'allocation on libere tout ...*/
    			do
    			{
    				free( tab[i] );
    				tab[i]=NULL;
    				i--;
    			}while(i>=0);
    		}
       }
    ta libération non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		if( tab[i]==NULL )
    		{	/* Erreur d'allocation on libere tout ...*/
                            i-- ;
    			do
    			{
    				free( tab[i] );
    				tab[i]=NULL;
    				i--;
    			}while(i>=0);
    		}

  13. #13
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    merci pour votre aide...je n'y comprend vraiment pas grand chose en C....
    avec mon code y a un probleme quand je dimensionne la taille de mon tableau à 3 ca marche mais lorsque je le dimensionne à 4 ca plante à l'execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    int main(int argc, char *argv[])
    {
     
      /* tableau a trier (tableau de pointeurs sur char const) */
     
       int *p = malloc(10*sizeof(int));
       T_type const *tab[3];
       *tab = malloc(3*sizeof(T_type));
     
       strcpy(tab[0], "c");
       strcpy(tab[1], "b");
       strcpy(tab[2], "a");
     
    /* affichage du tableau dans l'etat */
       aff (tab, sizeof tab / sizeof *tab);
     
       qsort (tab, sizeof tab / sizeof *tab, sizeof *tab, compare);
     
    /* affichage du tableau apres le tri */
       aff (tab, sizeof tab / sizeof *tab);
     
     
     
      system("PAUSE");	
     
     
     
      return 0;
    }
    ca ca marche
    par contre ca ca ne marche plus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    int main(int argc, char *argv[])
    {
     
      /* tableau a trier (tableau de pointeurs sur char const) */
     
       int *p = malloc(10*sizeof(int));
       T_type const *tab[4];
       *tab = malloc(4*sizeof(T_type));
     
       strcpy(tab[0], "c");
       strcpy(tab[1], "b");
       strcpy(tab[2], "a");
       strcpy(tab[3], "a");
     
    /* affichage du tableau dans l'etat */
       aff (tab, sizeof tab / sizeof *tab);
     
       qsort (tab, sizeof tab / sizeof *tab, sizeof *tab, compare);
     
    /* affichage du tableau apres le tri */
       aff (tab, sizeof tab / sizeof *tab);
     
     
     
      system("PAUSE");	
     
     
     
      return 0;
    }
    quelqu'un peut il m'expliquer?

  14. #14
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    mais ca ne marche toujours pas avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       strcpy(tab[0]->c, "c");
       strcpy(tab[1]->c, "b");
       strcpy(tab[2]->c, "a");
    a partir de 4 elements ca plante ...

Discussions similaires

  1. Complexité de l'algorithme de Tri Fusion
    Par judge06 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 26/03/2007, 22h04
  2. A propos des algorithmes de tri..
    Par Kerwando dans le forum C++
    Réponses: 4
    Dernier message: 19/08/2006, 11h43
  3. Probleme avec mon algorithme de tri
    Par kaygee dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2006, 21h23
  4. Réponses: 16
    Dernier message: 10/11/2005, 22h51
  5. algorithme de tri tableau :afficher que les éléments unique
    Par sofiane61 dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 31/03/2005, 19h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo