Tri sélection recursif

Résolu
victoria ghabri Messages postés 114 Statut Membre -  
 ksc -
Bonjour,

j'ai un petit programme a exécuter ,C'est le tri sélection récursif...le problème c'est qu'il ne fonctionne pas normalement dans touts les cas..(si je donne une taille de 5 ,il ne fait presque rien ,mais si je donne 10 il ordonne le tableau normalement..
voila le code ,syntaxiquement il est correcte ,mais aparament il y a un problème au niveau de la sémantique ,s'il vous plais aidez moi ..

LE CODE (c++) :
**********
#include <iostream>

using namespace std;

void tri_selection(int start_index,int A[],int n)
{int min_index;

if (start_index<n)
{
min_index=start_index;
for(int i=start_index;i<n;i++)
{
if (A[i]<=A[min_index])
min_index=i;
int aux=A[min_index];
A[min_index]=A[start_index];
A[start_index]=aux;
//cout<<A[min_index]<<endl;
}tri_selection(start_index+1,A,n);

}

}
void saisie (int n ,int A[])
{ int i;
for( i=0;i<n;i++)
{ cout<<"donner un element"<<endl;
cin>>A[i];
}
}
void affiche(int n,int A[])
{ int i ;
for(i=0;i<n;i++)
cout<<A[i] ;}

int main()
{ int A[100];int n;
cout<<"donner la taiile n"<<endl;
cin>>n;
saisie(n,A);
affiche(n,A);
tri_selection(0,A,n);
cout<<"***********"<<endl;
affiche(n,A);
return 0;
}
*******************fin code
merciii d'avance :))))

1 réponse

  1. ReganDryke Messages postés 13 Statut Membre 6
     
    Un gros coup de debuger plus tard j'ai enfin trouve le probleme dans ton code.

    Il vient de ta condition :
    if (A[i]<=A[min_index])


    Tu dois tester par rapport au start_index et non par rapport au min_index qui lui ce deplace. Si tu n'as pas de chance lors de ton test (cas d'erreur typique tableau de 5 valeur : 45231)
    Tu vas passer une fois et obtenir :15423
    mais quand il vas tester la cinquième valeur (tu sera a : 12543) ton min_index sera egal a 3 (car tu viens juste de passer le 2 en deuxième position) donc il vas comparer ton 3 avec ton 4 et donc deplacer ton 4 ce qui genere une erreur.

    Ps: a l'avenir est ce que tu pourrais espacer ton code quand tu demande de l'aide. Ca me faciliterai beaucoup le travail. Un code comme celui ci dessous est toujours plus facile a lire.

    #include <iostream>
    
    using namespace std;
    
    
    void tri_selection(int start_index,int A[],int n)
    {
        int min_index;
        if (start_index<n)
        {
            min_index=start_index;
            for(int i=start_index;i<n;i++)
            {
                if (A[i]<=A[start_index])
                {
                    min_index=i;
                    int aux=A[min_index];
                    A[min_index]=A[start_index];
                    A[start_index]=aux;
                    for(int j=0;j<n;j++)
                    {
                        cout<<A[j] ;
                    }
                    cout<<endl <<A[min_index]<<endl;
                }
            }
            tri_selection(start_index+1,A,n);
        }
    }
    
    void saisie (int n ,int A[])
    {
        int i;
        for( i=0;i<n;i++)
        {
            cout<<"donner un element"<<endl;
            cin>>A[i];
        }
    }
    
    void affiche(int n,int A[])
    {
        int i ;
        for(i=0;i<n;i++)
        {
            cout<<A[i] ;
        }
    }
    
    int main()
    {
        int A[100];int n;
        cout<<"donner la taiile n"<<endl;
        cin>>n;
        saisie(n,A);
        affiche(n,A);
        tri_selection(0,A,n);
        cout<<"***********"<<endl;
        affiche(n,A);
        return 0;
    }
    
    1
    1. victoria ghabri Messages postés 114 Statut Membre 5
       
      Impècable ,ça marche !! merciii enormement... et merci aussi pour le conseil :)) il y avait aussi un preobléme d'accolade que j'ai oublié de mettre aprés le if .et merci encore
      0
    2. ksc
       
      vous aurier pu faire passer 2 parametre seulement
      0