Tri sélection recursif

Résolu/Fermé
victoria ghabri Messages postés 95 Date d'inscription jeudi 27 septembre 2012 Statut Membre Dernière intervention 3 juin 2014 - 9 déc. 2012 à 14:40
 ksc - 9 mars 2021 à 20:49
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

ReganDryke Messages postés 13 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 22 février 2013 6
9 déc. 2012 à 15:11
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
victoria ghabri Messages postés 95 Date d'inscription jeudi 27 septembre 2012 Statut Membre Dernière intervention 3 juin 2014 5
9 déc. 2012 à 16:23
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
vous aurier pu faire passer 2 parametre seulement
0