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 merge sort


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Par d�faut algorithme merge sort
    Salut � tous,
    je viens vous soumettre mon code mergesort qui ne fonctionne pas,
    Je vous pr�sente les fonctions que j'ai �crites :
    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
    void fusion(int tab[], int deb, int mid, int end)
    {
    	int i= deb;
    	int j = mid + 1;
    	int size = end-deb+1;
    	int *tab2= new int[size];
    	int k = deb;
    	for (int p=0;p<size;p++)
    	{
    		tab2[p]=tab[p];
    	}
     
    	while (i<=mid && j <=end )
    	{
    		if(tab2[i]>tab2[j])
    		{
    			tab[k]=tab2[j];
    			j++;
    		}
    		else
    		{
    			tab[k]=tab2[i];
    			i++;
    		}
    		k++;
    	}
    	while(i<mid)
    	{
    		tab[k]=tab2[i];
    		i++;
    		k++;
    	}
     
    	while(j<end)
    	{
    		tab[k]=tab2[j];
    		j++;
    		k++;
    	}
     
    }
    void merge_sort(int tab[], int deb, int end)
    {
    	if(deb < end)
    	{
    	int mid=deb+(end-deb)/2;
    	merge_sort (tab,deb,mid);
    	merge_sort(tab,mid+1,end);
    	fusion(tab,deb,mid,end);
    	}
     
    }
    la fonction merge_sort effectue la division progressive du tableau et la fonction fusion fusionne tout en faisant le tri
    Pour l'entr�e suivante:

    |1005|2342|2608|7529|17926|24824|29165|32350|
    j'obtiens la sortie qui suit :
    |-357437318|-33686019|-33686019|0|1005|2342|7529|32350|

    merci d'avance pour votre aide et remarques

  2. #2
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Bonjour,

    Premi�re remarque, tu as un new, et aucun delete.
    C'est grave, tu devrais le remplacer par std::vector<int>(size).

    Pour ton probl�me de valeurs,
    Tes valeurs ressemble � des d�passements de valeur, surtout avec 32350, qui est tr�s proche de 32768, qui peut �tre la fronti�re des entiers 16 bits sign�s. Cela dit, vu les valeurs obtenues, je n'y crois pas.
    Par acquis de conscience, regarde le comportement pour {100,234,260,752,1792,2482,2916,3235}.

    Mon avis, c'est surtout que tu lis du rien, � cause des tableaux et pointeurs.
    Du coup, tu conserves de la m�moire al�atoire.

    Les valeurs obtenues sont-elles toujours les m�mes d'une ex�cution � l'autre.

  3. #3
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Par d�faut
    Bonjour ,
    J'ai test� avec des valeurs al�atoires entre 0 et 100 et j'obtiens la m�me chose

  4. #4
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Juste pour qu'on voit le probl�me un peu plus dans son ensemble, tu peux nous donner un main reproduisant ton probl�me?
    Prends {10,135,35,25,350} comme tableau d'exemple.

    Car quand le r�sultat n'est pas bon, �a vient soit du calcul, soit des donn�es (soit des subtilit�s, comme le passage d'argument).

  5. #5
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Par d�faut
    Voici le main et la fonction d'affichage du tableau en sortie

    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
     
    void AfficheTableau(int tableau[], int n)
    {
    	printf("|");
    	for(int i = 0; i < n; i++)
    	{
    		printf ("%d|",tableau[i]);
    	}
    	printf("\n");
     
    }
     
    void main()
    {
        int test[]={10,135,35,25,350};
        merge_sort( test, 0,4);
        AfficheTableau(test,5);
     
    }
    Voici le r�sultat obtenu en sortie:
    |0|10|35|35|350|

  6. #6
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Avec �a, J'ai ma petite id�e de solution.
    La valeur 35 a �t� dupliqu�e. pour moi, tu as une erreur d'indice.

    Ca peut ressembler � un for qui va une case trop loin.

    Essaie des tableaux pairs: {1,3,5,7}, {1,5,7,3} et {5,3,7,1}
    Je regarde de mon cot�.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Citation Envoy� par aaronlbk Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    	int size = end-deb+1;
    	int *tab2= new int[size];
    	int k = deb;
    	for (int p=0;p<size;p++)
    	{
    		tab2[p]=tab[p];
    	}
    Dans la mesure o� deb n'est pas syst�matiquement �gal � 0, en initialisant p � 0 puis en copiant les �l�ments de 0 � size (=end-deb) je ne suis pas s�r que tu copies les �l�ments cibles sur lesquels tu devrais travailler.
    Je pense (� v�rifier) que tu devrais copier tab[p+deb] et non tab[p].
    EDIT: et adapter tes autres calculs d'indice de la m�me fa�on.

  8. #8
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    En effet, ca devrait mieux marcher.

    Par ailleurs, aaronlbk, puisque tu es en C++, utilise le langage correctement.

    Tu dispose de vector pour ton tableau, de cout<< pour l'affichage.

    ce sera plus simple que printf.
    Par exemple, voici ta fonction d'affichage, avec le vector (et une r�f�rence constante, parce que tu ne veux pas le copier ni modifier).
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    void AfficheTableau(std::vector<int> const& tableau) {
    	for(int i = 0; i < tableau.size(); ++i) {
    	std::cout << '|' << tableau[i];
    	}
    	std::cout << '|' << std::endl;
    }

  9. #9
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2011
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 10
    Par d�faut
    Citation Envoy� par therwald Voir le message
    Dans la mesure o� deb n'est pas syst�matiquement �gal � 0, en initialisant p � 0 puis en copiant les �l�ments de 0 � size (=end-deb) je ne suis pas s�r que tu copies les �l�ments cibles sur lesquels tu devrais travailler.
    Je pense (� v�rifier) que tu devrais copier tab[p+deb] et non tab[p].
    EDIT: et adapter tes autres calculs d'indice de la m�me fa�on.
    Therwald J'ai essay� comme tu me l'as dit mais �� ne change rien � la sortie.

    Par ailleurs Eternel, j'ai essay� avec les entr�es de tableaux pairs, mais il y'a toujours des recopies des valeurs et ce nombre sign� qui apparait au d�but
    {1,5,7,3} donne |-33686019|1|3|3| en sortie
    {5,3,7,1} donne |-33686019|1|3|1|
    {1,3,5,7} donne|-33686019|1|3|7|
    Au fait y'a t'il besoin d'�crire
    std::cout<<
    au lieu de
    cout<<
    lorsqu'on a d�j� �crit
    using namespace std
    en tout d�but du code?

  10. #10
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    	int size = end-deb+1;
    	int *tab2= new int[size];
    	for (int p=0;p<size;p++)
    	{
    		tab2[p]=tab[p];
    	}
    -> std::vector<int> tab2(tab, tab+end-deb); (sans + 1 pour la taille, c'est une erreur)

    et

    while (i<=mid && j <=end ) -> while (i< mid && j < end ).


    S'il y a d�j� un using namespace std alors mettre std:: n'est pas utile. Mais c'est mieux pour savoir d'o� cela provient et ce type de using et plut�t risqu�.

    EDIT:
    Je me suis un peu m�lang� les pinceaux. Je vient de comprendre pourquoi il y avais +1... J'avoue avoir plus l'habitude des it�rateurs o� end correspond � la derni�re valeur non accessible.

    Alors pour le vecteur : vector(tab+deb, tab+end+1) sinon un mauvais intervalle est copi� (comme l'a dit thewald en fait)
    Par contre, la condition dans toutes les boucle devrait �tre avec <= et non < (l'inverse de ceux que je disait au d�but)
    Et l'acc�s � tab se fait en ajoutant -deb car les indices sont maintenant d�cal�s. Ou alors mettre apr�s la cr�ation du tableau :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
      i -= deb;
      j -= deb;
      end -= deb;
      mid -= deb;

Discussions similaires

  1. Tri par fusion (Merge Sort)
    Par saimer dans le forum G�n�ral Java
    R�ponses: 18
    Dernier message: 09/06/2015, 12h01
  2. Merge sort / tri fusion en LMC
    Par Lou E. dans le forum Assembleur
    R�ponses: 2
    Dernier message: 05/03/2015, 21h37
  3. Probl�me Merge Sort
    Par toufik135 dans le forum C
    R�ponses: 2
    Dernier message: 19/11/2012, 13h42
  4. Merge et Sort
    Par sam01 dans le forum z/OS
    R�ponses: 5
    Dernier message: 15/10/2009, 21h11

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