Tri rapide
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Tri rapide



  1. #1
    invitefa8436e7

    Tri rapide


    ------

    Bonjour,

    Je ne sais pas si c'est ici qu'il faut que je pose ma question mais j'ai un problème dans la mise au point d'un algorithme de tri rapide. J'ai écrit ce code en C :

    Code:
    int partition (T_Elt T[], int premier, int dernier)
    {
    int compteur=premier, i, pivot=T[premier], echange;
    	for(i=premier+1 ; i<=dernier ; i++)
    	{        
    		if(pivot>T[i])
    		{
    		compteur++;
    		echange=T[i];
    		T[i]=T[compteur];
    		T[compteur]=echange;
    		}
    	}
    	echange=T[premier];
    	T[premier]=T[compteur];
    	T[compteur]=echange;
    return(compteur);
    }
    
    void Tri_Rapide(T_Elt T[], int premier, int dernier)
    {
    int pivot;
    	if (premier<dernier)
    	{
    	pivot=partition(T, premier, dernier);
                 Tri_Rapide(T, premier, pivot-1);
                 Tri_Rapide(T, pivot+1, dernier);       
    	}
    }
    J'arrive à générer la solution mais lorsque je tente d'éxécuter, le programme plante. Auriez-vous une solution ?

    Merci d'avance

    -----

  2. #2
    sylvainc2

    Re : Tri rapide

    La logique semble correcte. Si ca plante c'est peut-être parce qu'il fait un trop grand nombre d'appels récursifs à Tri_Rapide(), si tu as une grand nombre de données à trier, la pile saute. Est-ce que ca plante aussi avec un petit nombre de données?

  3. #3
    invitefa8436e7

    Re : Tri rapide

    En fait, c'est un programme qui doit compter le nombre d'affectations et de comparaisons.

  4. #4
    invitefa8436e7

    Re : Tri rapide

    Il me semble aussi qu'il n'y a pas de problème de logique. J'ai un autre problème pour un tri arbre. J'ai écrit le code suivant :

    Code:
    void echanger (T_Elt T[], int i, int j)
    {
    int echange;
    echange=T[i];
    T[i]=T[j];
    T[j]=echange;
    }
    
    void remonter (T_Elt T[], int n, int i)
    {
    	if (i==1) return;
    	if (T[i]>T[i/2])
    		{
    		echanger (T, i, i/2);		
    		remonter (T, n, i/2);
    		}
    }
    
    void redescendre ( T_Elt T[], int n, int i)
    {
    int imax;
    	if (i>=n/2 +1) return;
    	if ((2*i+1<=n)&&(T[2*i+1]>T[2*i]))
    		imax=2*i+1;
    	else 
    		imax=2*i;
    	if (T[imax]>T[i])
    	{
    	echanger (T, imax, i);
    	redescendre (T, n, imax);
    	}
    }
    
    void organiser( T_Elt T[], int n )
    {
    int i;
    	for(i = 1 ; i < n ; i++)
    	remonter(T, n, i);
    }
    
    
    void Tri_Arbre( T_Elt T[], int n )
    {
    int i;
    organiser(T, n);
    	for(i=n-1 ; i>0 ; i-- )
    	{
    	echanger(T, 0, i);
    	redescendre(T, n, 0);
    	}
    }
    Cette fois, le compilateur m'indique une erreur de logique : le tableau que j'obtiens n'est pas trié... Où y aurait-il une erreur ?

    Merci d'avance

  5. A voir en vidéo sur Futura
  6. #5
    acx01b

    Re : Tri rapide

    salut

    tu t'es planté dans ton main, ta fonction tri_rapide elle fonctionne

  7. #6
    invitefa8436e7

    Re : Tri rapide

    Et pour le tri arbre ?

  8. #7
    invite897678a3

    Re : Tri dichotomique ou tri rapide ?

    Bonjour,

    Une petite idée...

    Si la fourchette de valeurs des éléments à trier est relativement limitée (<100 ou peut-être inférieure à 1 000) et dans la mesure où il vous pourriez créer un tableau aussi grand, il suffirait de lire chaque valeur et de la mettre à sa place dans le tableau.

    Lire ensuite le tableau (pour les valeurs non nulles): toutes les valeurs sont triées.

    C'est le tri qui tue!

  9. #8
    acx01b

    Re : Tri dichotomique ou tri rapide ?

    déja on a fait l'effort de regarder tri_rapide,
    tu sais c'est pas très intéressant de regarder un code "cas d'école" comme un tri ...

  10. #9
    invitefa8436e7

    Re : Tri rapide

    Alors là je suis entièrement d'accord : ça n'a rien d'intéressant. Mais c'est pas à moi qu'il faut le dire.

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/12/2008, 08h36
  2. Moteur tri ou pas tri ?
    Par invite1ddfb3ac dans le forum Électronique
    Réponses: 6
    Dernier message: 27/10/2008, 16h18
  3. TRI selectif
    Par invite672f2200 dans le forum Environnement, développement durable et écologie
    Réponses: 2
    Dernier message: 26/08/2008, 16h16
  4. Inter différentiel tri 380+N en tri 220+N
    Par invite06c380de dans le forum Technologies
    Réponses: 3
    Dernier message: 07/03/2008, 19h22
  5. tri
    Par invite69baa1f1 dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 02/10/2007, 11h04