Aller au menu - Aller au contenu

Le tri à paniers

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Pseudo Commentaire
Page 1 
Hors ligne Yno # Posté le 18/04/2007 à 11:30:40
Avatar
Flux RSS

Bonjour,

J'ai cru remarquer une petite erreur :
Citation : Tuto
Donc ici, ces nombres sont 2 et 16.


Le nombre 16 n'apparaît pas dans ton tableau. :-°

A part ça, je n'ai pas vraiment tout lu, je passais juste ici en vitesse, j'éditerai ;)

A+
 
Hors ligne Nanoc # Posté le 19/04/2007 à 21:06:57
Aimez-vous le C++ ?
Avatar
Validateurs

Ville : Durham
Pays : Royaume-Uni
Études : EPFL

Hello,

Ton tuto est intéressant, mais je rajouterai 2 choses:

1) Le tri n'est pas vraiment en O(n), car si je prends la liste
Code : Console
-1000   0   1000


n=3 et il va pourtant falloir créer 2000 paniers en mémoire ce qui va prendre plus de temps que créer 3 paniers.

Le tri serait plutot en O(n+m) ou m est la différence entre le plus grand et le plus petit élément à trier.

2) Ce tri est rapide mais il est par contre très mauvais au niveau de la taille en mémoire. Puisque il va falloir créer m paniers (où m est la différence entre le maximum et le minimum).
Si par exemple je prends la liste,
Code : Console
-10'000'000   0   10'000'000

Je remplis 1GB de RAM (en C si je code mes nombres comme des int), pour une liste qui ne contient que 3 éléments :( (bien choisis il est vrai).

Voilà sinon ben:
Secret (cliquez pour afficher)
16
 
Hors ligne fredleshaman # Posté le 19/04/2007 à 21:39:59
> fred-le-shaman@hotmail.com <
Avatar

Bravo, j'ai bien aimé ce tuto :) .

C'est une technique très séduisante, j'éspère que j'aurais un jour l'honneur de l'utiliser.

++

Fredleshaman n'est plus, si vous voulez vraiment le contacter, envoyer un e-mail à fred-le-shaman@hotmail.com .
 
Hors ligne bluestorm # Posté le 13/05/2007 à 23:13:23
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Comme l'explique Nanoc, ce tri n'est pas du tout O(N).
En effet, la complexité de "calloc" est linéaire selon la taille de la mémoire demandée, et du coup tu as bien du O(N + max - min). De même pour ta boucle "for(i = 0; i <(max-min)+1; i++)".

Il n'est pas donc pas forcément "rapide", et même "en général" très lent : si on prend des int au hasard (dans leur intervalle standard dans le langage qu'on utilise), il sera beaucoup, beaucoup, beaucoup plus lent qu'un tri par insertion, par exemple (qui lui-même n'est pas un tri de complexité optimale).
Il n'est donc utile que dans le cas où on connaît une propriété très restrictive sur les valeurs qu'on nous donne à trier. En fait, il peut être étendu pour obtenir un tri linéaire sur n valeurs répartis dans un intervalle de taille n^2 par exemple, mais cela sort un peu de ton tuto et reste beaucoup moins général que le cas "tri d'entiers quelconques" que tu présentes.

De plus, si l'on veut un tri stable, et qui fonctionne de manière un peu plus générique (au lieu de comparer directement des entiers, on trie un tableau de valeurs de type inconnu avec une fonction qui associe un entier à chaque valeur (par exemple à un grand nombre on associe la valeur de son dernier chiffre)), ça devient tout de suite beaucoup plus lourd (à coder), puisqu'il faut des listes dans chaque "panier" pour stocker les éléments.

Honnêtement, je trouve que l'erreur au niveau du calcul de la complexité est très gênante : tu devrais essayer de la corriger au plus vite.
 
Hors ligne GuilOooo # Posté le 14/05/2007 à 18:35:34
Attention, je mords !
Avatar
Modérateurs

Je suis désolé de pas m'être manifesté plus tôt, je n'avais pas assez de temps pour m'y mettre et ça m'est sorti de la tête. Donc, j'ai corrigé l'erreur de complexité c'est en validation. Ca devrait donc bientôt arriver.

C'est vrai que pour la complexité, j'ai pas l'habitude ^^ quand on a un calloc faut penser à l'initialisation. Mais pour ce qui est du tri d'éléments qui ne sont pas des entiers, ça peut s'adapter facilement: il suffit que les éléments soient comparables entre eux et que t'aies un tableau qui résume tous les états possibles. Mais en général on triera des entiers ou des objets en utilisant une propriété entière. Enfaite, c'était surtout pour présenter l'idée que j'ai écrit ça... Enfin merci de vos remarques !

HaskellReal World HaskellLearn yourself HaskellGentille intro à HaskellTuto SdZ
ErlangBuzzerl@home???

Modérateur spécialiste du langage C.
Bien poster sur le forum de CMe contacter
 
Hors ligne Apobis # Posté le 15/05/2007 à 18:18:40

Études : Télécom Bretagne

Bon tuto, les explications sont claires. Je ne connaissais pas cette méthode en plus :)
Hors ligne bluestorm # Posté le 17/05/2007 à 10:18:41
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Oui, la complexité est bien mieux maintenant, merci ^^

Citation
Mais pour ce qui est du tri d'éléments qui ne sont pas des entiers, ça peut s'adapter facilement: il suffit que les éléments soient comparables entre eux et que t'aies un tableau qui résume tous les états possibles.

Mais justement, souvent résumer tous les états possibles n'est pas intéressant ou faisable (par exemple si je veux trier des flottants selon leur partie entière), et le tableau doit alors être plus lourdement modifié (au lieu de noter seulement les occurrences de chaque entier, on stocke les éléments qui correspondent à l'entier donné).
 
Hors ligne woufeigh # Posté le 20/05/2007 à 01:40:31
Webnul
Avatar

Heuh ce ne serait pas mieux de faire une liste chainée plutot qu'un tableau dynamique.
A chaque fois qu'on ne remplis pas le noeud, donc qu'on n'y met pas de jeton, on le supprime.
Ca améliorera la taille mémoire.


C'est ce que j'en ressort après une première lecture rapide

Follow this link to get my resume: http://fulldev.eu/carlos-dasilva
 
Hors ligne GuilOooo # Posté le 20/05/2007 à 11:29:21
Attention, je mords !
Avatar
Modérateurs

Citation : Blues'

Mais justement, souvent résumer tous les états possibles n'est pas intéressant ou faisable (par exemple si je veux trier des flottants selon leur partie entière), et le tableau doit alors être plus lourdement modifié (au lieu de noter seulement les occurrences de chaque entier, on stocke les éléments qui correspondent à l'entier donné).

sûr qu'en fait, c'est loin d'être adapté pour tout...

Citation : woufeigh

Euh ce ne serait pas mieux de faire une liste chaînée plutôt qu'un tableau dynamique.
A chaque fois qu'on ne remplis pas le noeud, donc qu'on n'y met pas de jeton, on le supprime.
Ca améliorera la taille mémoire.

Ca dépend. Il faudra quand même allouer un grand nombre de paniers si la liste est très disparate. Donc le principal problème pour la mémoire reste : si on a des écarts de 100000 dans la liste, il faudra 100 000 paniers, soit environ 400 ko de mémoire... Même avec des listes chaînées.
Et le truc c'est que la liste, on la reconstruira complètement depuis le début, qui qu'il arrive. Et ça prends aussi du temps de construire la liste. En plus, on va se retrouver avec deux listes : l'originale et une deuxième, la triée. Pour des listes énormes => deux fois plus de mémoire utilisée. Alors qu'avec un tableau, on peu le trier direct dans l'espace mémoire une fois qu'on a lu les paniers.
Donc la solution ça serait de lire les paniers, de supprimer la liste, et de la reconstruire. Mais supprimer et reconstruire la liste ça prends quand même pas mal de temps, et, comme je l'ai dit plus haut, le problème des paniers subsiste. Donc c'est pas forcément mieux.

HaskellReal World HaskellLearn yourself HaskellGentille intro à HaskellTuto SdZ
ErlangBuzzerl@home???

Modérateur spécialiste du langage C.
Bien poster sur le forum de CMe contacter
 
Hors ligne landeguy # Posté le 16/02/2008 à 22:04:46
Ou pas!
Avatar

Le tuto est bien, la méthode de tri est surtout bonne avec des listes à chiffre répétitifs et pas éloignez.
Ma note est 18 car c'est très très bien expliquer mais manue un peeu de fignolage ^^ .

Je suis en tain de faire un Zelda ammateur, si vous etes interresse(e) pour y participer envoyez moi un MP (je vais bientot en faire un topic) ^^
 
Hors ligne Silverlink # Posté le 15/08/2008 à 12:48:59

Études : Ensimag

Citation : GuilOooo
La formule pour avoir le nombre d'entiers entre min et max est (min-max)+1.

Et on obtient un bel entier négatif :-°
C'est juste une petite erreur d'inattention, mais bon ça m'a sauté aux yeux.
Sinon le tuto est clair, bien que j'ai l'impression (et le calcul de complexité confirme) que ce code ne soit intéressant que dans des cas très particuliers...
Hors ligne GuilOooo # Posté le 15/08/2008 à 12:58:07
Attention, je mords !
Avatar
Modérateurs

Hum exact :-° .

Pour une erreur si minime, je ne vais malheureusement pas corriger tout de suite. Je viens d'envoyer mon tuto à la validation pour une modficiation mineure, si je le refais ça risque de gonlfer les jaunes.

Merci pour cette correction ^^ .

HaskellReal World HaskellLearn yourself HaskellGentille intro à HaskellTuto SdZ
ErlangBuzzerl@home???

Modérateur spécialiste du langage C.
Bien poster sur le forum de CMe contacter
 
Hors ligne galopin_ # Posté le 22/03/2009 à 15:37:42

Allez parceque c'est vous, voila un code (C++) du radix sort, il marche peut importe les valeurs, sur des entiers et des floatant et est de loin plus rapide qu'un trie classique!

Code : C++
  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
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
#pragma	once

#ifndef __RADIXSORT_H__
#define __RADIXSORT_H__

#define LITTLE_ENDIAN
namespace radix {

    // utility meta function to know type attributes
    template <typename T> inline bool IsFloat();
    template <typename T> inline bool IsSigned();

    // two floating types.
    template <>           inline bool IsFloat<float>()     { return true;}
    template <>           inline bool IsFloat<double>()    { return true;}

    // others are integers.
    template <typename T> inline bool IsFloat()            { return false;}


    // floating types are signed.
    template <> inline bool IsSigned<float>()              { return true; };
    template <> inline bool IsSigned<double>()             { return true; };

    // unsigned types.
    template <> inline bool IsSigned<unsigned short>()     { return false; };
    template <> inline bool IsSigned<unsigned int>()       { return false; };
    template <> inline bool IsSigned<unsigned long>()      { return false; };
    template <> inline bool IsSigned<unsigned long long>() { return false; };
    
    // signed types.
    template <> inline bool IsSigned<signed short>()       { return true; };
    template <> inline bool IsSigned<signed int>()         { return true; };
    template <> inline bool IsSigned<signed long>()        { return true; };
    template <> inline bool IsSigned<signed long long>()   { return true; };
    
    // we need to fix endianess ordering.
    // LE: LSB to MSB, BE: MSB to LSB
    template< typename T>
    inline unsigned int FixMsbEndianess( unsigned int b)
    {
        #ifdef LITTLE_ENDIAN
        return b;
        #else
        return sizeof(T)-1-b;
        #endif
    }

    ///////////////////////////////////////////////////////////////////////////////////
    // Radix sort
    // in: input is the array data to sort
    // in: nb is the array data size
    // out: output, will contains sorted indices
    template < typename T, typename IndexT>
    void Sort(const T* input, unsigned int nb, IndexT* output)
    {
        // Checkings
        if(!input || !output || !nb)	return;

        IndexT* output2 = (IndexT*)alloca(sizeof(IndexT)*nb);

        // Allocate histograms & offsets on the stack
        unsigned int mHistogram[256*sizeof(T)];

        // Create histograms (counters). Counters for all passes are created in one run.
        // Pros:	read input buffer once instead of four times
        // Cons:	mHistogram is sizeof(T)*256 instead of 1Kb

        /* Clear counters */
        memset(mHistogram, 0, 256*sizeof(T)*sizeof(unsigned int));												
        
        unsigned int* h0,*h1,*h2,*h3,*h4,*h5,*h6,*h7;        
        /* Prepare to count */		
        h0= &mHistogram[256*0];		    
        h1= &mHistogram[256*1];	        
        if (sizeof(T) > 2)
        {
            h2= &mHistogram[256*2];	    
            h3= &mHistogram[256*3];	    
        }
        if (sizeof(T) == 8)
        {
            h4= &mHistogram[256*4];	    
            h5= &mHistogram[256*5];	
            h6= &mHistogram[256*6];	
            h7= &mHistogram[256*7];	
        }

        // count each byte in the associate histogram
        for (unsigned int idx = 0;idx<nb;++idx)
        {																							
            /* Read input input in previous sorted order */										
            const T& Val = (T)input[idx];			
            unsigned char* p = (unsigned char*)&Val;	

            /* Create histograms */																	
            h0[*p++]++;	h1[*p++]++;	
            if (sizeof(T) > 2)
            {
                h2[*p++]++;	h3[*p++]++;											
            }
            if (sizeof(T) == 8)
            {
                h4[*p++]++;	h5[*p++]++;	h6[*p++]++;	h7[*p++]++;											
            }
        }				

        // Compute #negative values involved if needed
        unsigned int NbNegativeValues = 0;
        if (IsSigned<T>())
        {
            // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128
            // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte,
            // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers.
            unsigned int* h_msb;
            h_msb = &mHistogram[256*FixMsbEndianess<T>(sizeof(T)-1)];

            for(unsigned int i=128;i<256;i++)	NbNegativeValues += h_msb[i];	// 768 for last histogram, 128 for negative part
        }

        // we'll swap buffer for each byte done.
        IndexT* outputDst = output2;
        IndexT* inputSrc = output;

        // Radix sort, j is the pass number (0=LSB, sizeof(T)-1=MSB)
        for(unsigned int j=0;j<sizeof(T);j++)
        {
            unsigned int* CurCount = &mHistogram[ FixMsbEndianess<T>(j) * 256 ];													

            /* Check pass validity */																	

            /* If all values have the same byte, sorting is useless. */									
            /* It may happen when sorting bytes or words instead of dwords. */							
            /* This routine actually sorts words faster than dwords, and bytes */						
            /* faster than words. Standard running time (O(4*n))is reduced to O(2*n) */					
            /* for words and O(n) for bytes. Running time for floats depends on actual values... */		

            unsigned char UniqueVal;
            /* Get first byte */	
            UniqueVal = *(((unsigned char*)input)+FixMsbEndianess<T>(j));		

            /* Reset flag. The sorting pass is supposed to be performed. (default) */					
            /* Check that byte's counter, j == 0 must be done to initialize output */																
            unsigned int PerformPass = (j == 0) || CurCount[UniqueVal]!=nb;

            // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is
            // not a problem, numbers are correctly sorted anyway.
            if(PerformPass)
            {
                unsigned int mOffset[256];
                
                // Should we care about negative values? only for the msb
                if ( !IsSigned<T>()  || j!=sizeof(T)-1 )
                {
                    // use a register, fix memory load hit store issue
                    unsigned int lastOffset = 0;

                    // Here we deal with positive values only
                    mOffset[0] = 0;

                    // Create offsets
                    for(edU32 i=1;i<256;i++)
                        lastOffset = (mOffset[i] = lastOffset + CurCount[i-1]);
                }
                else
                {
                    // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place.

                    // use a register, fix memory load hit store issue
                    unsigned int lastOffset = NbNegativeValues;

                    // Create biased offsets, in order for negative numbers to be sorted as well
                    mOffset[0] = NbNegativeValues;	
                    // First positive number takes place after the negative ones
                    for(unsigned int i=1;i<128;i++)		
                        lastOffset = (mOffset[i] = lastOffset + CurCount[i-1]);	// 1 to 128 for positive numbers

                    // floating type case differ from integer
                    if (!IsFloat<T>())                    
                    {
                        // use a register, fix memory load hit store issue
                        unsigned int lastOffset = 0;

                        // Fixing the wrong place for negative values
                        mOffset[128] = 0;

                        for(unsigned int i=129;i<256;i++)			
                            lastOffset = (mOffset[i] = lastOffset + CurCount[i-1]);
                    }
                    else
                    {
                        // use a register, fix memory load hit store issue
                        unsigned int lastOffset = 0;

                        // We must reverse the sorting order for negative numbers!
                        mOffset[255] = 0;

                        for(unsigned int i=0;i<127;i++)		
                            lastOffset = (mOffset[254-i] = lastOffset + CurCount[255-i]);	// Fixing the wrong order for negative values
                        for(unsigned int i=128;i<256;i++)	
                            mOffset[i] += CurCount[i];				// Fixing the wrong place for negative values
                    }
                }

                // Perform Radix Sort
                unsigned char* InputBytes	= (unsigned char*)input;

                InputBytes += FixMsbEndianess<T>(j);

                // LSB is special, we initialize fake previous ordering
                if (j==0)
                {
                    for (unsigned int idx = 0;idx<nb;++idx)
                        outputDst[mOffset[ InputBytes[idx*sizeof(T)] ]++] = idx;
                }
                else
                {
                    // common case, only MSB of floating type need something else
                    if (!IsFloat<T>() || j!=sizeof(T)-1)
                    {
                        for (unsigned int idx = 0;idx<nb;++idx)
                        {
                            unsigned int real_idx = inputSrc[idx];
                            outputDst[mOffset[ InputBytes[real_idx*sizeof(T) ]]++] = real_idx;
                        }
                    }
                    else
                    {
                        // Perform Radix Sort
                        for(unsigned int i=0;i<nb;i++)
                        {
                            unsigned int real_idx = inputSrc[i];

                            unsigned int Radix = (*((unsigned int*)input+real_idx))>>24;								// Radix byte, same as above. AND is useless here (edU32).
                            // ### cmp to be killed. Not good. Later.
                            if(Radix<128)		outputDst[mOffset[Radix]++] = real_idx;		// Number is positive, same as above
                            else				outputDst[--mOffset[Radix]] = real_idx;		// Number is negative, flip the sorting order
                        }
                    }
                }

                // Swap pointers for next pass. Valid indices - the most recent ones - are in mIndices after the swap.
                std::swap(outputDst,inputSrc);
            }
            else
            {
                // The pass is useless, yet we still have to reverse the order of current list if all values are negative.
                if(IsFloat<T>() && (j==sizeof(T)-1) && UniqueVal>=128)
                {
                    for(unsigned int i=0;i<nb;i++)	outputDst[i] = inputSrc[nb-i-1];

                    // Swap pointers for next pass. Valid indices - the most recent ones - are in mIndices after the swap.
                    std::swap(outputDst,inputSrc);
                }
            }
        }

        // may happen if not all byte need sorting.
        if (inputSrc != output)
        {
            memcpy(output,inputSrc,sizeof(IndexT)*nb);
        }
    }
}
#endif
Hors ligne GuilOooo # Posté le 22/03/2009 à 16:48:42
Attention, je mords !
Avatar
Modérateurs

Intéressant. Je n'ai pas testé pour le moment, faute de temps, mais j'ai tout de même une remarque : le radix sort trie les valeurs chiffre par chiffre, d'abord par unités, puis par dizaines, etc, de manière stable.
Ce n'est pas la même chose qu'un tri par comptage, ou tri par paniers.

HaskellReal World HaskellLearn yourself HaskellGentille intro à HaskellTuto SdZ
ErlangBuzzerl@home???

Modérateur spécialiste du langage C.
Bien poster sur le forum de CMe contacter
 
Hors ligne galopin_ # Posté le 28/03/2009 à 14:40:36

Bien sur que si, le tri panier n'est qu'une spécialisation du radix, ou la base (radix) est déjà supérieur à ton range de valeur :)

Et en informatique, oublie les dizaines, centaines and co, on travaille en base 2 :D ici on tri par octet!
Hors ligne elmcherqui # Posté le 05/12/2009 à 03:28:49
la vie est un programme
Avatar

Ville : Casablanca
Pays : Maroc
Études : SUPINFO Maroc à Casablanca

galopin a raison le tri radix utilise le tri panier pour trier chaque chiffre vu que c'est decimal donc petit intervalle c'est tous benef .
par contre tu peux choisir la base avec laquelle tu veux trier c'est pas forcement par octet ni tri par bit , generalement la decimale fait largement l'affaire ,parceque avec le binaire ce que tu va gagner en long tu va le perdre en large .
pour choisir la base ideale c'est base = log nombre_element . (log de base deux ) .

- La répétition est humaine , la récurrence Divine .
- il faut être fou pour ne pas utiliser la récursivité quand il le faut !

 
Hors ligne quelqu'un du 86 # Posté le 05/08/2011 à 11:13:22
printf("Hello Zeros !\n");
Avatar

Très bon tutoriel,
simple accessible complet.

:p Il faut manger pour vivre mais pas vivre pour manger :p

#LGDF: M@teo21 vaincra !
 
Hors ligne Pierroda # Posté le 14/04/2012 à 11:51:31
Avatar

Avis : Bon

Ville : Verviers
Pays : Belgique
Études : Université de Liege

Avec une complexité O(N + (max-min)), tu bats tous les autres algorithmes, qui sont soit des O(n^2) ou des O (n log n). Il y a donc une erreur dans ton calcul de complexité.
 
Hors ligne shareman # Posté le 14/04/2012 à 13:49:44
Faisons semblant
Avatar

Citation : Pierroda
Avec une complexité O(N + (max-min)), tu bats tous les autres algorithmes, qui sont soit des O(n^2) ou des O (n log n). Il y a donc une erreur dans ton calcul de complexité.


Tu te renseignes avant de conclure aussi vite ? Ça serait bien.

En l'occurrence la limite pour les tris basés sur les comparaisons est de O(n log n) dans le cas général. Tu serais surpris d'apprendre qu'il existe des meilleurs des cas (pour les tris à comparaison) linéaires :

- Smoothsort : au mieux en O(n), sinon en O(n log n)
- Timsort : au mieux en O(n), sinon en O(n log n)
- Et si on pousse à l'extrême, Insertion sort : au mieux en O(n), sinon en O(n²)

Alors, mieux que O(n log n) donc ça n'existe pas ? Pour les tris qui ne sont pas basés sur les comparaisons, on a par exemple :

- Counting sort (tri à paniers) : O(N + (max-min))
- Radix sort : O(kN) où k est la taille de la plus grande clef

Honnêtement, ce n'est pas moi qui ai écrit ce cours, c'est GuilOooo, mais ça m'énerve de le voir commenté, jugé et noté par des gens qui ne s'y connaissent pas. Ce n'est pas un mal de ne pas s'y connaitre, mais si déjà, on ne se permet pas de juger ("donc il y a une erreur"... heu s'il te plait hein)

Et si tu es d'accord, je veux bien que tu expliques ce qui ne t'a pas plu pour que tu mettes "mitigé". C'est ton droit, si tu ne veux pas te justifier, tu as le droit, mais je suis curieux. :)

Image utilisateur
« Sex, drugs and rock n'roll... enlevez la drogue et vous aurez plus de temps pour les deux autres »
Steven Tyler, Aerosmith
 
Hors ligne Pierroda # Posté le 14/04/2012 à 14:50:44
Avatar

Avis : Bon

Ville : Verviers
Pays : Belgique
Études : Université de Liege

shareman, je suis d'accord avec la seconde parie de ton message. En effet, je n'avais pas pensé que c'était un tri sans comparaison. Donc je suis d'accord : je me suis trompé.

Par contre, concernant la première de ton message, tu triches un peu :) En effet, ça n'a aucun de parler d'analyse de complexité dans le meilleur cas. Dans le cas moyen ou dans le pire cas, c'est censé, mais pas dans le meilleur cas ! Car le Bubble Sort, le Selection Sort sont aussi linéaire dans le meilleur cas. Alors qu'en moyenne et dans le pire cas, ils sont quadratiques. Et je suppose que tu es d'accord pour dire que ces deux algorithmes font partie des moins efficaces des algorithmes de tri.
 
Hors ligne shareman # Posté le 14/04/2012 à 15:05:00
Faisons semblant
Avatar

Moi je partais du principe que tu te disais "un comportement mieux que O(n log n), ça n'existe pas". Si ce n'est pas le cas, il y a eu malentendu, et effectivement ma première partie ne sert à rien, mais reconnais que ton commentaire portait à confusion à ce niveau-là :)

Cependant, à titre informatif, le tri par sélection est toujours quadratique. Sinon je te mets bien sûr au défi d'en implémenter un qui ne le soit pas, mais qui reste tout de même un vrai tri par sélection.

Image utilisateur
« Sex, drugs and rock n'roll... enlevez la drogue et vous aurez plus de temps pour les deux autres »
Steven Tyler, Aerosmith
 
Hors ligne Pierroda # Posté le 15/04/2012 à 22:24:11
Avatar

Avis : Bon

Ville : Verviers
Pays : Belgique
Études : Université de Liege

Ca portait bien à confusion, je suis d'accord.

Quant au Selection Sort, tu as également raison : il est toujours quadratique ;)
 
Pour accéder à cette section
Connectez-vous !
connexion_rpx