ramatouFinal

Embed Size (px)

Citation preview

  • 7/23/2019 ramatouFinal

    1/54

    Implementation of a variety of sorting algorithms, and

    Ramatou ABIBOUSemestre 5 unication

    Emai

    Assistant Responsable : Andrew BROWN

    Professeur : Amin SHOKROLLAHI

    Semestre dHiver 2004

    Sorting Algorithms

    look at their behavior and running times on different

    inputs.

    , Systmes de Comm

    Facult I&C, EPFL

    l : [email protected]

    1

    http://www.epfl.ch/
  • 7/23/2019 ramatouFinal

    2/54

    Rsum

    Un sujet majeur dalgorithmique est le tri dobjets tels que les tableaux. Le choix du

    meilleur algorithme pour une tache particulire peut tre un processus compliqu, qui exigesouvent des analyses mathmatiques sophistiques.

    La plupart des algorithmes de tri consistent simplement ranger des nombres dun tableau

    dans lordre numrique ou des caractres par ordre alphabtique : il est donc important de

    comprendre que les algorithmes sont trs largement dpendant du type des lments trier,

    et quen fin de compte il nest pas difficile de passer une gnralisation.

    Les algorithmes de tri prsents dans ce document sont soit :

    - lmentaires: tri bulles, tri par slection, tri par insertion et tri par shell

    - complexes: tri rapide (quicksort), tri trois-mdiane, tri par tas (heapsort)

    Il est aussi important de prciser quil sagit ici dalgorithmes de tri internes qui

    supposent que laccs alatoire chaque lment est possible avec le mme cot, cest par

    exemple le cas si les donnes sont stockes dans la mmoire vive.

    Ces algorithmes sont tudis sous laxe danalyse et de la performance. Cette performance

    a t mesure sur les mmes outils et dans les mmes conditions (mme ordinateur, mme

    compilateur) pour chaque mthode afin de ne pjorer lune dentre elles et avoir une base

    de comparaison fiable. La performance dans notre cas se dfinit par le temps que prend

    lalgorithme pour excuter le tri dun tableau et le nombre total de comparaisons et de

    mouvements (un change correspond trois mouvements) que lalgorithme effectue pour

    trier lobjet soumis (dans notre cas un tableau)

    Pour analyser les diffrents algorithmes de tri, nous avons implment en langage de

    programmation C et calcul le nombre doprations fondamentales effectu par chaque

    mthode de tri ci-dessus cit en fonction des lments trier. Cette mthode nous a permis

    danalyser le comportement de chaque algorithme de tri appliqu un tableau presque tri,

    non tri, et tri dans lordre inverse. Cette mthodologie nous a permis darriver aux

    conclusions suivantes :

    - de manire gnrale, les tris complexes sont plus performants que les mthodes de

    tri lmentaires en regard dun volume de donnes important

    - Le choix de la mthode de tri dpend fortement du volume de donnes trier.

    Leffort dimplmentation des mthodes de tri complexes doit tre mis dans labalance avec leur performance afin deffectuer le choix le plus adquat et le plus

    optimal

    - Le tri Shell qui requiert peu de code est un bon compromis performance Versus

    Volume de donnes si les incrments sont bien dfinis.

    2

  • 7/23/2019 ramatouFinal

    3/54

    Table des Matires

    RESUME ---------------------------------------------------------------------------------------------- 2

    TABLE DES MATIRES-------------------------------------------------------------------------- 3

    1. INTRODUCTION ------------------------------------------------------------------------------ 5

    1.1 Historique des Algorithmes de Tri.---------------------------------------------------------------------------------6

    1.2 Situation actuelle et perspectives des Algorithmes de Tri. ---------------------------------------------------6

    2. TRIS ELEMENTAIRES --------------------------------------------------------------------- 82.1 Tri Bulles (Bubble Sort)--------------------------------------------------------------------------------------8

    2.1.1 Mthode et Implmentation-------------------------------------------------------------------------------------82.1.2 Analyse et Performance Thoriques du Tri bulles ----------------------------------------------------102.1.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 122.1.4 Courbes Obtenus---------------------------------------------------------------------------------------------122.1.5 Observations et Conclusions sur lAlgorithme du Tri Bulles ----------------------------------------15

    2.2 Tri par Slection (Selection Sort)-------------------------------------------------------------------------------- 152.2.1 Mthode et Implmentation du Tri par Slection------------------------------------------------------------ 152.2.2 Analyse et Performance Thoriques du Tri par Slection ------------------------------------------------- 172.2.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 18

    2.2.4 Courbes Obtenus------------------------------------------------------------------------------------------------182.2.5 Observations et Conclusions sur le Tri par Slection ------------------------------------------------------20

    2.3 Tri par Insertion (InsertionSort)---------------------------------------------------------------------------------- 212.3.1 Mthode et Implmentation ----------------------------------------------------------------------------------- 212.3.2 Analyse et Performance Thoriques du Tri par Insertion -------------------------------------------------- 222.3.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 242.3.4 Courbes Obtenus------------------------------------------------------------------------------------------------242.3.5 Observations et Conclusions sur lAlgorithme du Tri par Insertion-------------------------------------- 25

    2.4 Tri par Shell (Shell Sort) ------------------------------------------------------------------------------------------- 262.4.1 Mthode et Implmentation ------------------------------------------------------------------------------------ 262.4.2 Analyse et performance Thoriques du Tri ------------------------------------------------------------------ 28

    2.4.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 282.4.4 Courbes Obtenus------------------------------------------------------------------------------------------------282.4.5 Observations et Conclusions sur lAlgorithme du Tri Shell-----------------------------------------------28

    2.5 Comparaisons des Tris Elmentaires---------------------------------------------------------------------- 29

    3. TRIS SOPHISITIQUES OU COMPLEXES-----------------------------------------------31

    3.1 Tri Rapide (quiksort)------------------------------------------------------------------------------------------------ 313.1.1 Mthode et Implmentation----------------------------------------------------------------------------------- 313.2.2 Analyse et performance du Thoriques du Quicksort------------------------------------------------------- 333.2.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 35

    3.1.4 Courbes Obtenus---------------------------------------------------------------------------------------------353.1.5 Observations et Conclusions sur lAlgorithme du Quicksort---------------------------------------------- 36

    3

  • 7/23/2019 ramatouFinal

    4/54

    3.2 Tri Trois-Mediane : Amlioration du tri rapide par la stratgie du choix du pivot ------------------ 363.2.1 Mthode et Implmentation ----------------------------------------------------------------------------------- 373.2.2 Analyse et performance Thoriques du Tri------------------------------------------------------------------ 383.2.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 393.2.4 Courbes Obtenus------------------------------------------------------------------------------------------------393.2.5 Observations et Conclusions sur lAlgorithme du Tri 3-mediane ---------------------------------------- 40

    3.3 Tri par Tas ( Heapsort )------------------------------------------------------------------------------------------- 403.3.1 Mthode et Implmentation ------------------------------------------------------------------------------------ 413.3.2 Analyse et Performance Thoriques du Heapsort ---------------------------------------------------------- 453.3.3 Rsultats des Tests Effectus---------------------------------------------------------------------------------- 463.3.4 Courbes Obtenus------------------------------------------------------------------------------------------------463.3.5 Observations et Conclusions sur lAlgorithme du Heapsort ---------------------------------------------- 47

    3.4 Comparaisons des Tris Sophistiqus----------------------------------------------------------------------- 48

    4. CONCLUSION GENERALE -----------------------------------------------------------------48

    5. ANNEXE DES RESULTATS DES TESTS ----------------------------------------------53

    4

  • 7/23/2019 ramatouFinal

    5/54

    1.INTRODUCTIONUn algorithmedcrit un traitement sur un certain nombre fini de donnes. Il est fait dun

    ensemble fini dtapes.

    Quest-ce quun tri ?On suppose quon se donne un suite de N nombres entiers, et on veut

    les ranger en ordre croissant (ou dcroissant) au sens large. Ainsi, pour n = 7, la suite

    (5, 2, 3, 0, 6, 1, 1) devra devenir (0, 1, 1, 2, 3, 5, 6).

    Cest ainsi que plusieurs algorithmes de tri sont dvelopps. Ils permettent de trier

    ou ranger une srie de donnes dans un ordre prcis (Par exemple dans un ordre

    alphabtique). Les algorithmes de tri sont trs importants en pratique, en particulier sur les

    graphes (tri topologique ou TopSort en Anglais, Kushukal, etc), dans les systmes

    dexploitation et aussi dans le domaine de linformatique de gestion o beaucoup

    dapplications consistent trier des fichiers.

    De plus on estime que plus que 25% du temps de calculs utilis commercialement estconsacr aux oprations de tri (sorting). Ceci illustre limportance dudveloppement des

    mthodes de tri puissantes. Mais ces dernires peuvent tre lentes ou rapides selon la taille

    des donnes trier ou si le tableau est presque tri, non tri et tri dans lordre inverse.

    Afin de contribuer en partie la rduction de temps de calcul (25%), le but de ce projet est

    danalyser et de comparer des algorithmes pour prdire quelle mthode de tri conviendrait

    le mieux aux donnes trier : do le problme du choix optimal des mthodes de tris.

    Dans tout ce qui suit, on suppose que lon trie des nombres entiers et que ceux-ci se

    trouvent dans un tableau.

    Complexit dun algorithme :

    Analyser un algorithme revient prvoir les ressources (i.e. la quantit de mmoire)

    ncessaires cet algorithme et mesurer son temps dexcution. En gnral, quand on

    analyse plusieurs algorithmes candidats pour un problme donn, on arrive aisment

    identifier le candidat le plus efficace. Ce type danalyse peut rvler plusieurs candidats

    valables et permet dliminer les autres.

    Comme la plupart des mthodes de tri interne, les algorithmes effectuent deux types

    doprations : des comparaisons entre cls et des changes dlments.

    On compte le nombre de ces oprations fondamentales pour un tableau de N lments, ce

    qui donne une ide de la complexit.

    Si on sintresse lapplication des tris dans la ralit, souvent on a des donnes de grandes

    tailles trier, cest donc ncessaire de voir comment ces mthodes de tri se comportent

    quand la taille du tableau devient grande. Do le nom de la complexit : bonne infrieure

    et suprieure. Plusieurs chercheurs ont travaill sur la complexit des algorithmes de tri et

    ont confirm les rsultas ci-dessus que nous avons tester au cous de ce projet et a savre

    vrai

    Lanalyse dun algorithme, mme simple, peut savrer difficile. Il est donc ncessaire de

    se donner des outils mathmatiques pour parvenir nos fins.

    5

  • 7/23/2019 ramatouFinal

    6/54

    Notation asymptotique

    Les fonctions que lon considre dans cette section sont des fonctions de N dans N. Soient

    f et g deux fonctions.

    Dfinition 1 : On dira que f est O(g) si et seulement si il existe c > 0 et n0 tel que

    f(n) 0 et n0 tel que f(n) > c g(n)

    Dfinition 3 : On dira que f est o(g) si et seulement si lim (f(n)/g(n))= 0,si n tend vers

    linfini.

    Dfinition 4 : On dira que f est (g) si et seulement sil existe c1, c2 > 0 et n0 tel que

    c1g

  • 7/23/2019 ramatouFinal

    7/54

    Dans la pratique, les fichiers trier sont soit de petite taille mais trs nombreux, soit alors

    partiellement tris ou mme dj, ou alors contiennent un grand nombre de cls dupliqus :

    pour ces fichiers, les algorithmes lmentaires savrent mieux adapts, tandis que les

    algorithmes sophistiqus entranent des surcharges les rendant moins efficaces.

    De nos jours, on continue optimiser les algorithmes de tris en amliorent leur

    implmentation mais sans pour pouvoir changer radicalement leur complexit, cest--dire

    les bornes suprieures et infrieures.

    Au lieu de penser dvelopper de nouveaux algorithmes de tris hyper-sophistiqus dans le

    futur, il serait srement intressant de contourner ou rgler les failles ou carences des

    algorithmes lmentaires, ceci afin desprer viter les ventuels problmes de surcharge

    tout en bnficiant dune bonne complexit.

    7

  • 7/23/2019 ramatouFinal

    8/54

    2.TRIS ELEMENTAIRESIls sont au nombre de quatre tudis dans ce projet, leur implmentation est facile et

    requiert trs peu de code.

    Les tableaux trier sont reprsents comme suit : a[0],a[1],a[i]a[N-1] avec N la

    taille du tableau o i est lindice du ime lment du tableau.

    Par convention dans ce rapport, on note par :

    - MoyC, MaxC et MinC respectivement le nombre de comparaisons moyen (cas

    moyen), maximal (pire des cas) et minimal (meilleur des cas).

    - MoyE, MaxEet MinE respectivement le nombre dchanges moyen, maximal et

    minimal.

    - MoyM, MaxM et .MinM respectivement le nombre de mouvements moyen,

    maximal et minimal.

    Un change correspond trois mouvements.

    2.1 Tri Bul les (Bubble Sort)

    Le nom de ce tri vient de ce que les lments les plus grands (lourds) remontent vers la

    fin du tableau comme les bulles vers le haut dun tube essai.

    Cest le tri le plus simple que nous allons tudier.

    2.1.1 Mthode et ImplmentationLe tri Bulle est une mthode de tri qui consiste comparer successivement tous les

    lments adjacents dun tableau et les changer si le premier lment est suprieur au

    second. On recommence cette opration tant que tous les lments ne sont pas tris. A

    chaque tape de lalgorithme llment maximal est dplac la fin de la suite.

    Voici un exemple dapplication de cette mthode sur un tableau de taille N=6

    a[0] a[1] a[2] a[3] a[5]Donnes : 115 101 30 63 20 47

    1repassage:Echanges : 101115

    3011563115

    8

  • 7/23/2019 ramatouFinal

    9/54

    2011547115

    Rsultat du 1er passage 101 30 63 20 47 115

    Au 1erpassage llment (115) ,le plus grand du tableau est dplac en N-1 (ici 5

    me) position

    2me passage:Echanges: 30101

    6310120101

    47101

    Rsultat du 2me passage 30 63 20 47 101 115

    Au 2mepassage llment (101),deuxime plus grand lment du tableau est dplac en N-2( ici 4me) position

    3me passage:pas dechanges: 30 < 63

    Echanges: 206

    4763

    30 20 47 63 101 115Rsultat du 3me passage

    Au 3mepassage llment (63) , 3me plus grand lment du tableau est dplac en N-3 (ici 3me) position

    4me passage :Echanges:

    2030pas dechanges: 30 < 47

    Rsultat du 4me passage20 30 47 63 101 115

    Au 4mepassage llment (47),4me plus grand lment du tableau est dplac en N-4 (ici 2me) position

    5me

    passage:Pas dechanges: 20 < 30

    20 30 47 63 101 115Rsultat du 5me passage

    Au 5me le tableau est tri et lalgirithme sarrte et on saperoit quil y a N-1 (5 passages)

    Code Source de tri bulle en Langage C#i ncl ude

    9

  • 7/23/2019 ramatouFinal

    10/54

    voi d Bubbl eSort ( i nt *a , i nt N, l ong l ong *echanges, l ong l ong*compar ai son){bool condi t i on =f al se;

    i nt r = N- 1;whi l e( ! condi t i on) {

    condi t i on = true;f or ( i nt i =1; i

  • 7/23/2019 ramatouFinal

    11/54

    Les complexits en nombre de comparaisons pour le tri bulle sont donc :

    MaxC(N)= N(N-1)/2)=O(N^2)

    MoyC(N)=O(N^2)

    MinC(N) = N-1=O(N)

    Nombre de Mouvements :

    Le nombre dchanges maximal (MaxE) :

    Le nombre dchanges peut tre au maximal N-1 au premier parcours de la while de la

    mthode BubbleSort implmente ci-dessus, N-2 au deuxime parcours, ainsi de suite

    jusqu 1 change au N-1 parcours. Cest le cas si le tableau est tri en ordre dcroissant.

    On a donc:

    N-1

    MaxE(N) = (N-i) = N(N-1)/2 MaxM(N) =3* N(N-1)/2i=1

    La complexit au pire en nombre de mouvements du tri bulle est en O(N^2) .Notons que

    si le tableau est tri, on ne fait aucun mouvement.

    MinM(N)=0

    Calcul par dnombrements du nombre dchanges moyen (tableau non tri).

    Soit t un tableau de taille N et t son miroir (t[1]=t[N],t[2]=t[N-1],.t[N]=t[1])

    Si on excute lalgorithme sur t et t, chaque paire dlments est change, soit dans t, soit

    dans t, jamais dans les deux. Donc pour le tri de t et t on a en tout autant dchanges quil

    y a de paires dlments dindices diffrents, soit N(N-1)/2 changes, donc 3*N(N-1)/2

    mouvements.

    Considrons lensemble T de tous les tableaux de taille N, ne comportant pas dlments

    gaux. Supposons quils sont tous quiprobables. Daprs la dfinition de la complexit en

    moyenne, si cot E(t) est le nombre dchanges effectus pour trier le tableau t, et si p(t) est

    la probabilit du tableau t ,on a :

    MoyE(n) = p(t).cotE(t)

    t

    T

    11

  • 7/23/2019 ramatouFinal

    12/54

    On peut partitionner T en Tc, ensembles des tableaux de taille N tels que t[1]< t[N] et Td ,

    ensemble des tableaux de taille N tels que t[1]>t[N] . Si t Tc, alors t Td et

    rciproquement. Do :

    MoyE(N) = p(t).cotE(t) + p(t).cotE(t)

    t Tc t Td

    Tous les tableaux tant quiprobable, posons pour tout t, p(t) =p. On obtient :

    MoyE(n) = p*( cotE(t) + cotE(t))

    t Tc t Td

    = p*(cotE(t) + cotE(t))

    t Tc

    = p *N(N-1)/2 = p *card(Tc)* N(N-1)/2

    Il existe une bijection entre Tc et Td, ils sont donc de mme cardinalit, do :

    P *card(Tc)=1/2

    Par consquent :

    MoyE(N) = 1/2 * N(N-1)/2 = N(N-1)/4

    Dans le cas o les lments sont distincts, et o les listes ont de mme probabilit, on a

    en nombre de mouvements :

    MoyM(N) = 3* N(N-1)/4 = O(N^2)

    Par consquent, la complexit en moyenne en nombre de mouvements du tri bulles est en

    O(N^2).

    Pour le tri bulle, le comportement pire des cas, moyen des cas et meilleur des cas

    sobtiennent respectivement avec un tableau tri dans lordre inverse, non tri et presque

    tri

    2.1.3 Rsul tats des Tests Effectus

    -Voir annexe1

    2.1.4 Courbes Obtenus

    12

  • 7/23/2019 ramatouFinal

    13/54

    Bubble

    0

    100000000000

    200000000000

    300000000000

    400000000000

    500000000000

    600000000000

    1 100 10000 1000000

    N

    Nbredemouvements+Nbre

    decomparaisons

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    Bubble

    0

    0.5

    1

    1.5

    2

    2.5

    1 10 100 1000 10000 10000

    0

    1E+06

    N

    (Nbredem

    ouvements+

    compara

    isons)/N^2

    Tableau non tri (moyen descas)

    Tableau tri dans l'ordre

    inverse (pire des cas)Tableau dj tri (meilleurdes cas)

    13

  • 7/23/2019 ramatouFinal

    14/54

    Bubble

    0.000000

    20000.000000

    40000.000000

    60000.000000

    80000.000000

    100000.000000

    120000.000000

    140000.000000

    1 100 10000 1000000

    N

    Temps

    Tableau non tri(moyen des cas)

    Tableau tri dansl'ordre inverse (pire descas)

    Tableau dj tri(meilleur des cas)

    Bubble

    0.0000000.000020

    0.000040

    0.000060

    0.000080

    0.000100

    0.000120

    1 100 10000 1000000

    N

    Temps/N^2 Tableau non tri

    (moyen des cas)

    Tableau tri dansl'ordre inverse (pire

    des cas)Tableau dj tri(meilleur des cas)

    14

  • 7/23/2019 ramatouFinal

    15/54

    2.1.5 Observations et Conclusions sur lAlgori thme du Tri Bulles

    Etant donn que sa complexit en nombre moyen et maximal de mouvements est assez

    leve, le tri bulles a peu dintrt en pratique.

    Pour un tableau presque tri, thoriquement cette mthode semble intressante et bonne carelle moins coteuse en comparaisons. Mais si on regarde loin dans la ralit et dans les cas

    pratiques, on ignore ce bon comportement de la mthode de tri bulle car on cherche

    toujours mettre dans lordre une suite dobjets disposes en dsordre.

    Selon la thorie, la complexit du tri bulles est quadratique : il trie un tableau en un

    temps 0(N^2), cest--direque le temps pour trier un tableau de taille N (N lments) est

    proportionnel au carr de la taille. Ce rsultat est parfaitement illustr et confirm par les

    tests effectus ci-dessus.

    Une piste damlioration du tri bulles serait, lors du parcours de la boucle interne FOR, de

    vrifier que llment i se trouve la bonne position ( a[i] ).

    Dans les paragraphes suivants, on analysera dautres algorithmes de tri qui tiennent compte

    de lordre des lments dans le tableau initial.

    2.2 Tri par Slection (Selection Sort)

    2.2.1 Mthode et Implmentation du Tri par Slection

    Lide est de trier un tableau en dterminant son plus petit, son deuxime plus petit,

    troisime plus petit, etc. lment. Cest dire trouver la position du plus petit lment

    dans le tableau et ensuite changer a[0] et a[i1]. Ensuite, dterminer la position i2 de

    llment avec le plus petit des a[1],..a[N-1] et changer a[1] et a[i2]. On continue

    de cette manire jusqu ce que tous les lments soient dans la position correcte.

    Un avantage de tri par slection est quil est progressif, car ltape i de lalgorithme, le

    tableau est tri de a[0] jusqu a[i-1]

    Donnes :

    Slection 20

    115 101 30 63 20 47

    Placement 20 101 30 63 115 47

    Slection 30Placement

    20 30 101 63 115 47

    Slection 47Placement20 30 47 63 115 101

    15

  • 7/23/2019 ramatouFinal

    16/54

    Slection 63 : Pas de changement sur le tableau, car 63 est lui-mme le 4imeplus petit lment.

    Placement

    20 30 47 63 115 101

    Slection 101Placement

    20 30 47 63 101 115

    Dans lexemple de tri par slection ci-dessus, les lments placs dans le bon ordre se trouvent gauche de labarre verticale

    Commentaires : Comme on le voit dans lexemple ci-dessus, le dernier lment (115) nest

    pas slectionn. En effet, comme cet algorithme se fait de faon progressive et le dernier

    lment du tableau tant le plus grand, il est dj la bonne position.

    Si tel ntait pas le cas, il aurait t slectionn et chang avec dautres lments dutableau par consquent il ne serait au dernier placement.

    16

  • 7/23/2019 ramatouFinal

    17/54

    Code Source de tri Slection en Langage C

    #include

    #include

    #include "swap.cpp"void selectionSort(int* a, int N, long long* echanges, long long * comparaisons)

    {

    for (int i = 0; i < N; i++)

    {

    int min = a[i];

    int minIndex = i;

    for (int j = i; j < N; j++)

    {

    (*comparaisons)++;

    if (a[j] < min)

    {min = a[j];

    minIndex = j;

    }

    }

    if (i != minIndex)

    (*echanges)++;

    swap(a,i,minIndex);

    }

    }

    2.2.2 Analyse et Performance Thoriques du Tri par Slection

    Nombre de comparaisons:

    Pour tout tableau de taille N, on effectue exactement N-1 comparaisons pour trouver le 1er

    minimum, N-2 comparaisons pour trouver le 2me minimum, ainsi de suite. Plus

    prcisment, on fait (N-1-i) comparaisons pour trouver le ime minimum du tableau.

    Avec le tri par slection, le nombre de comparaisons de cls ne dpendent pas de lanature du tableau (presque tri, non tri et tri dans lordre inverse). Ainsi on a:

    N-i

    MaxC N)=MinC (N)=MoyC(N)= (N-1- i) = N(N-1)/2

    i=1

    Les complexits en nombre de comparaisons pour le tri par slection sont donc :

    MaxC(N)=MinC (N)=MoyC(N) =N(N-1)/2 = O(N^2)

    17

  • 7/23/2019 ramatouFinal

    18/54

    Nombre de Mouvements:

    Aussi pour les changes, la complexit au pire des cas est gale la complexit en

    moyenne. Puisquon fait au maximum un seul change chaque parcours de la boucle

    FOR interne de lalgorithme implment en paragraphe 2.21. Comme on a N lments dans

    le tableau. On a donc :

    MaxE(N)= N-1

    MaxM(N)= 3*(N-1)

    Avec le calcul par dnombrement du nombre dchanges moyen, comme a t fait

    pour le tri par bulle au paragraphe 2.12, on peut montrer que le nombre moyen dchanges

    est :

    MoyE(N)=N/N-1 + (N-1)/(N-2)+ . +2/1 = N- ln(N) + (1)

    Le nombre dchanges moyen doit tre multipli par trois pour obtenir le nombre demouvements moyen (MoyM(N)).

    Lescomplexits au pire et en moyenne en nombre de mouvements de la slection

    sont en O(N).

    Pour un tableau presque tri, lchange ne se fait jamais car ce nest pas ncessaire : do

    MinE(N) = 0

    2.2.3 Rsul tats des Tests Effectus

    -Voir annexe2

    2.2.4 Courbes Obtenues

    18

  • 7/23/2019 ramatouFinal

    19/54

    0.0000000

    200000.0000000

    400000.0000000

    600000.0000000

    800000.0000000

    1000000.0000000

    1200000.0000000

    1 10 100 1000 1000

    0

    1E+0

    5

    1E+0

    6

    N

    t(

    ms)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau non tri (moyen des

    cas)Tableau dj tri (meilleur des

    cas)

    0.0000000000000

    0.0000010000000

    0.0000020000000

    0.0000030000000

    0.0000040000000

    0.0000050000000

    0.0000060000000

    0.0000070000000

    0.0000080000000

    0.0000090000000

    1 100 10000 1000000

    N

    t(ms)/N^2

    Tableau tri dans l'ordreinverse (pire des cas)

    Tableau non tri (moyendes cas)

    Tableau dj tri (meilleurdes cas)

    19

  • 7/23/2019 ramatouFinal

    20/54

    0.00

    20000000000.00

    40000000000.00

    60000000000.00

    80000000000.00

    100000000000.00

    120000000000.00

    140000000000.00

    1 100 10000 1000000

    N

    Nbre

    Echange-comparaison

    Tableau non tri (pire

    des cas)

    Tableau tri dans l'ordreinverse (moyen des cas)

    Tableau dj tri

    (meilleur des cas)

    0.0000000000000

    0.1000000000000

    0.2000000000000

    0.3000000000000

    0.4000000000000

    0.5000000000000

    0.6000000000000

    0.7000000000000

    0.8000000000000

    1 10 100 1000 1000

    0

    1E+0

    5

    1E+0

    6

    N

    Nbreechange-comparaison/N^2

    Tableau non tri (pire des

    cas)

    Tableau tri dans l'ordre

    inverse (moyen des cas)

    Tableau dj tri (meilleur des

    cas)

    2.2.5 Observations et Conclusions sur le Tri par Slection- En observant les courbes ci-dessus, on se rend compte que les rsultats thoriques de

    complexit dmontrs et confirms par plusieurs chercheurs dans le domaine de

    lalgorithme reste aussi vrai en pratique, heureusement pour lhistoire des tris.

    -Le premier graphe du haut illustrent les rsultats du temps mis par le tri Slection pour

    trier un tableau de taille N. Comme a t dmontr thoriquement ci-dessus, les graphes en

    temps ont une allure quadratique pour les types de tableaux utiliss dans ce projet (enN^2), ce qui est vrai seulement partir dune certaine valeur trs grande, on voit sur le

    graphe que cette valeur correspond N= 10^5. Par ailleurs on saperoit facilement sur le

    graphe quil existe une constante k =temps/N^2 39*10^-7 partir de N=10^4.

    Les deux derniers graphes illustrent bien que le nombre de comparaisons plus le nombre de

    mouvement suivent bien N^2 et la constante K 0.5 partir de N=10^4

    b) Avantage par rapport dautres tris:

    Aucun autre algorithme ne peut trier un tableau avec aussi peu de mouvements que le tri

    par Slection. En effet comme le nombre dchanges en pire des cas et en moyen des cas

    est linaire, c'est--dire en O(N), il peut tre intressant pour des entres qui ncessitent

    beaucoup plus dchanges et trs peu de comparaisons. Par exemple le tri par Slectionsurpasse beaucoup de mthodes plus sophistiques dans un type important dapplication :

    20

  • 7/23/2019 ramatouFinal

    21/54

    Dans la pratique, cest la mthode choisir pour trier un nombre important de petits

    fichiers (quivalent un tableau de petite taille associ de grandes cls.

    -Dsavantage par rapport dautres tris:

    Lun des inconvnients de ce tri est que son temps dexcution ne dpend pas de la nature

    de lentre trier. IL passe quasiment le mme temps pour trier un tableau dj tri, un

    tableau gnr de faon alatoire et un tableau tri dans lordre inverse.

    Remarquons aussi que la mthode par Slection est peu pratique pour les tableaux

    partiellement tri et dj tri contrairement tri bulle qui a une complexit O(n) pour le

    meilleur des cas. On verra au paragraphe suivant une mthode qui trie tout en accordant une

    attention particulire aux types de tableau partiellement tri.

    2.3 Tri par Insertion (InsertionSort)

    2.3.1 Mthode et Implmentation

    Lide est de trier successivement les premiers lments du tableau. A la ime tape on

    insre le ime lment son rang parmi les i-1 lments prcdents qui sont dj tris entre

    eux. Lalgorithme commence par sexcuter partir du 2me lment du tableau. Cette

    mthode sappelle aussi la mthode du joueur de cartes. Les tapes successives sont

    dcrites ci-dessous.

    Voici un exemple dapplication de cette mthode sur un tableau de taille N=6

    a[0] a[1] a[2] a[3] a[4] a[5]Donnes: 115 101 30 63 20 47

    1reinsertion : 101 115 30 63 20 47

    2meinsertion: 30 101 115 63 20 47

    3reinsertion:

    30 63 101 115 20 47

    4reinsertion

    : 20 30 63 101 115 47

    21

  • 7/23/2019 ramatouFinal

    22/54

    5me

    insertion: 20 30 47 63 101 105

    Le tableau est trijusqu la barre verticale ; llment insrer est encercl

    #include

    void Insertion ( int *a, int N,long long *echanges ,long long * comparaisons,long long *mouvements)

    {

    for (int i= 1;it && j>=0){a[j+1]=a[j];

    (*mouvements)++;j=j-1;(*comparaisons)++;

    }

    a[j+1]=t;(*mouvements)++;

    }}

    2.3.2 Analyse et Performance Thoriques du Tri par Insertion

    Nombre de comparaisonsPour insrer le ime lment, nous avons au moins 1 et au plus i-1 comparaisons faire.

    On a donc:

    N

    MaxC(N ) = (i -1) =O(N^2)i=2

    22

  • 7/23/2019 ramatouFinal

    23/54

    MinC(N)=N-1

    On peut montrer comme a t dmontr pour le tri bulle que :

    MoyC(N)= O(N^2)

    Nombre de MouvementsContrairement aux autres algorithmes o on compte le nombre dchanges, la mthode de

    tri par insertion fait uniquement des mouvements.

    Cet algorithme est facile analyser. Ainsi :On compte i-1 mouvements dans le meilleur des cas (le comportement avec le tableau dj

    tri). Do :

    MinM(N)=0

    Avec un tableau tri dans lordre inverse, ce qui, pour ce tri, est le pire des cas :

    La boucle interne WHILE qui se trouve dans limplmentation ci-dessus fait au maximum

    N-i itrations si on est la ime insertion, comme on commence le tri partir de i=2 (

    deuxime lment du tableau.) en plus on a N lments au total dans le tableau.

    Le nombre de mouvements maximal se calcule comme suit :

    N

    MaxM(N)=(i-2) = O(N^2)

    i=2

    La complexit du nombre de mouvements maximal est : MoyM(N) ==O(N^2)

    Avec le calcul par dnombrement du nombre dchanges moyen, comme a t fait

    pour le tri par bulle au paragraphe 2.12 , on peut montrer que le nombre moyens dchanges

    est :

    MoyM(N)=N*(N+3)/4

    La complexit du nombre moyen de mouvements est : MoyM(N) ==O(N^2)

    La complexit en O(n^2) qui est prouver thoriquement seront justifis par les rsultats destests et les graphes ci-dessous..

    23

  • 7/23/2019 ramatouFinal

    24/54

    2.3.3 Rsul tats des Tests Effectus

    -Voir annexe 3

    2.3.4 Courbes Obtenus

    InsertionSort

    0.00000

    500000.00000

    1000000.00000

    1500000.00000

    2000000.00000

    1 100 10000 1000000

    N

    t(ms)

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    InsertionSort

    0

    0.000002

    0.000004

    0.000006

    0.000008

    0.00001

    1 100 10000 1000000

    N

    t(ms)

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    24

  • 7/23/2019 ramatouFinal

    25/54

    insertionSort

    0

    5E+10

    1E+11

    1.5E+1

    1

    2E+11

    2.5E+1

    1

    3E+11

    1 100 10000 1000000

    N

    NbreEchange-

    comparaison

    Tableau non tri (moyen

    des cas)Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    InsertionSort

    0

    0.2

    0.4

    0.6

    0.8

    1

    1.2

    1 100 10000 1000000

    N

    Nbre

    echange

    +comparaison/N^2

    Tableau non tri (moyendes cas)

    Tableau tri dans l'ordreinverse (pire des cas)

    Tableau dj tri

    (meilleur des cas)

    2.3.5 Observations et Conclusions sur l Algorithme du Tri par Insertion

    Avantages du tri Insertion par rapport dautres tris:

    A la diffrence du tri par Slection, le temps dexcution du tri par Insertion dpend

    essentiellement de lordre initial des cls dans le tableau. Par exemple si le tableau est

    grand et que les cls sont dj ordonnes (ou presque ordonnes), le tri par insertion est

    rapide, tandis que le tri par slection est lent.

    Dsavantages du tri Insertion par rapport dautres tris:

    Pour un tableau tri dans lordre inverse ; le fait que le tri par Slection fait au maximum

    N-1 changes (=3*(N-1) mouvements) fait que quand N devient trs grand, par exemple on

    le voit sur les graphes que pour N= 5*10^5, le tri Par Slection est plus rapide que le tri par

    insertion.

    25

  • 7/23/2019 ramatouFinal

    26/54

    En conclusion, il est noter quon pourrait amliorer le temps de calcul de tri par insertion

    pour amliorer son comportement dans le meilleur des cas en vitant les transferts inutiles

    pour un tableau dj tri .

    Jai remarqu ceci lors des tests pratiques, jai rflchi ce problme et jai abouti la

    conclusion que seul le tableau dj tri en bnficie, le cas moyen trs peu car les nombres

    utiliss pour les tris dans ce projet sont gnrs alatoirement. Ainsi on ne gagne pasbeaucoup en optimisant de cette manire et surtout parce que cest en faveur des tableaux

    dj tris qui ne refltent pas les problmes de tri dans la ralit.

    2.4 Tri par Shell (Shell Sort)Cet algorithme de tri a t dvelopp en 1950 par D. L. Shell

    2.4.1 Mthode et ImplmentationRappel : La lenteur du tri par insertion est due au fait que les seules permutations ralises

    le sont avec des lments adjacents. Les lments peuvent donc parcourir tout le tableau

    mais en ne se dplaant que dune place la fois. Par exemple, si llment de plus petite

    cl est la fin du tableau, N tapes sont ncessaires pour le placer correctement.

    Le tri Shell est une extension du tri par insertion qui entrane un gain de temps en

    permutations dlments ventuellement trs loigns.

    Il faut rorganiser le tableau de manire obtenir un sous tableau ordonn en slectionnant

    tous les h-imes lments ( partir de nimporte quelle position initiale)

    Un tel tableau est dit h-ordonn et il est constitu de h sous tableaux ordonnsindpendants, entrelacs. En h-ordonnant le tableau pour une grande valeur de h, on

    change les lments trs distants dans le tableau, afin de faciliter la mme opration pour

    les valeurs infrieures de h. Lutilisation dune telle mthode avec une srie dcroissante

    de h termine par 1 donne un tableau tri : Cest le principe du tri Shell.

    Une manire dimplmenter le tri Shell serait dutiliser, pour chaque valeur de h un tri par

    insertion de manire indpendante sur chacun des h tableaux. En dpit de lapparente

    simplicit de ce processus, il est possible dutiliser une approche encore plus simple

    prcisment parce que les sous tableaux sont indpendants.

    Comment dcider de lincrment utiliser ?En gnral, il est assez difficile de donner une rponse. Les proprits de nombreuses

    squences dincrments ont t tudies et beaucoup dentre elles fonctionnent trs bien

    dans la pratique, sans quil soit toutefois possible de trouver la meilleure dentre elles. En

    pratique ,on utilise des squences qui dcroissent de manire de manire gomtrique ,ce

    qui fait que le nombre dincrments est fonction du logarithme de la taille du tableau .Par

    exemple ,si chaque incrment est environ la moiti du prcdent, on a seulement besoin de

    20 incrments pour trier un tableau dun million dlments et si le rapport est de 1 4

    seulement de 10 incrments pour le mme tableau..

    Lutilisation daussi peu dincrments que possible est une caractristique importante qui

    est facile respecter. Il est galement ncessaire de considrer les interactions

    26

  • 7/23/2019 ramatouFinal

    27/54

    arithmtiques entre ces incrments comme la taille de leurs diviseurs communs et dautres

    proprits.

    Lutilisation dun bon incrment pour effet pratique daugmenter la vitesse denviron

    25%, mais ce problme est un vritable casse-tte qui donne un bon exemple de la

    complexit dun algorithme apparemment simple.

    La squence dincrments 1, 4, 13, 40, 121, 364, 1093, 3280, 984... utilise danslimplmentation du tri Shell dans ce projet, dont le ratio entre les incrments est denviron

    un tiers , a t propose par Knuth en 1969 .Celle -ci est facile gnrer (on dmarre avec

    1 ,on calcule le prochain incrment en multipliant le prcdent par trois et en ajoutant1) et

    donne un tri relativement efficace ,mme pour des fichiers de taille plus petite.

    Peut on encore faire mieux ?Beaucoup dautres squences dincrments donnent un tri plus efficace, mais il est difficile

    davoir un gain de plus de 20% du rsultat obtenu par la squence des incrments de Knuth,

    mme pour les valeurs de N trs grandes.

    Notons que la squence 4^(i+1)+ 3*2^i +1 pour i>0 , qui donne 1, 8 (pour i=0),23(pour

    i=1), 77(pour i=2),281,1076,4193,16577, est vraiment la plus rapide dans le pire des cas.Les squences dincrments encore meilleures peuvent trs bien exister. Il faut juste se

    baser sur les squences de bases et essayer de les amliorer. Dun autre ct, il existe de

    mauvaises squences : par exemple la suite gomtrique de raison 2 (1,2,4.) qui est la

    squence originale propose par Shell en 1959 donne de mauvaises performances parce

    que les lments de position impaire ne sont pas compars avec ceux de position paire

    jusqu la passe finale.

    Code en C du tri Shell

    #include "methods.h"

    void Shellsort (int *a,int l,int r,long *comparaisons,long*mouvements){

    for (int h = 1; h 1;h /=3)

    printf("%d\n",h);

    for(int i=l+h;i=h+l)&&(v

  • 7/23/2019 ramatouFinal

    28/54

    2.4.2 Analyse et performance Thoriques du TriShell

    La description de lefficacit du tri Shell est forcment imprcise parce que personne

    na jamais russi analyser cet algorithme. Cette lacune dans la connaissance rend difficile

    non seulement lvaluation de diffrentes squences dincrments mais aussi lacomparaison analytique de ce tri avec les autres mthodes. Bien que la modlisation

    formelle du temps dexcution de ce tri Shell ne soit pas connue (il dpend en effet de la

    squence utilise). Knuth trouver que la modlisation formelle donne par N(log(N))^2 et

    N^1.25 donne de bons rsultats.

    Complexit de lalgorithme tri Shell implment dans ce projet est :

    -Pour le nombre de comparaisons

    MoyC(N)=O(N^3/2)

    MaxC(N)=O(N^3/2)

    MinC(N)=O(N^3/2)

    -Pour le nombre de mouvements

    MoyM(N)=O(N^3/2)

    MaxM(N)=O(N^3/2)

    MinM(N)=O(N^3/2)

    2.4.3 Rsul tats des Tests Effectus-Voir annexe 4

    2.4.4 Courbes Obtenues

    Shell Sort

    0.00

    100000.00

    200000.00

    300000.00

    400000.00

    500000.00

    600000.00

    700000.00

    800000.00

    0 200000 400000 600000

    Taille du tableau

    Temps(ms)

    Temps dans le casmoyen

    2.4.5 Observations et Conclusions sur lAlgorithme du Tri Shell

    La courbe ci-dessus suit bien lallure de N^3/2. On peut donc dire que son temps de tri croit

    moins vite que les algorithmes de complexit O(N^2). On a galement vu que le tri Shellpeut devenir trs mauvais si le choix de lincrment nest pas judicieux. Lalgorithme est

    28

  • 7/23/2019 ramatouFinal

    29/54

    trs facile coder, mais le choix de lincrment optimal est plus complexe, ce qui rend

    difficile une gnralisation de sa performance.

    Pour conclure, voquons certains aspects connus de lanalyse de ce tri. Lobjectif ici est de

    montrer que mme des algorithmes apparemment simples peuvent avoir des performances

    comparables celles des tris complexes.

    2.5 Comparaisons des Tris Elmentaires

    Voici un tableau rcapitulatif de leurs complexits

    Nombre de comparaisons Nombre de mouvementsAlgorithme

    Min Moy Max Min Moy Max

    Tri bulle N-1 N(N-1)/2 N(N-1)/2 0 3*N(N_1)/4 N(N-3)/2

    Tri

    Slection

    N(N-1)/2 N(N-1)/2 N(N-1)/2 0 N ln(N) + (1) 3*(N-1)

    Tri

    Insertion

    N-1 N*(N+3)/4 N(N-3)/2 0 N*(N+3)/4 N(N-5)/2

    Tableau contenant le nombre de comparaisons et de mouvements des tris lmentaires

    Nombre de comparaisons Nombre de mouvementsAlgorithme

    Min Moy Max Moy Max

    Tri bulle O(N) O(N^2) O(N^2) O(N^2) O(N^2)

    Tri

    Slection

    O(N^2) O(N^2) O(N^2) O(N) O(N)

    Tri

    Insertion

    O(N) O(N^2) O(N^2) O(N^2) O(N^2)

    Tri Shell O(N(log(N))^2)

    Tableau contenant les performances des tris lmentaires

    29

  • 7/23/2019 ramatouFinal

    30/54

    On sait que la plus part des tris lmentaires (Bulle, Insertion, Slection) ont une

    complexit quadratique en O(N^2) except le tri par Shell.Mais Le tri Bulle est gnralement plus lent que les deux autres (Insertion et Slection)

    on peut amliorer cet algorithme de manire viter les parcours sans changes.

    Jusquici, mon rapport a prsent quatre mthodes de tri simples ; Un lment de

    comparaison entre ces mthodes est que les mthodes de slection donnent ltape i, le

    dbut du futur tableau trier. On dit que ce tri est progressif. Cela permet de commencer

    ventuellement un traitement en parallle sur ce tableau. Cela nest pas possible si on utilise

    une mthode par Insertion.

    Pour un tableau alatoire (non tri): Le temps dexcution de tri bulle est environ 2 fois

    celui de tri par Slection dont le temps est environ une fois et demi celui de Insertion.

    On peut donc conclure que le tri par insertion est le meilleur, suivi par le tri Slection et en

    dernier le tri par Bulle qui est vraiment lent pour les entres alatoires.

    Par contre pour les entres spciales, par exemple :

    Pour un tableau presque tri: le tri bulle est 10 fois mieux que Slection partir de N

    =10000 mais Insertion reste toujours le meilleur car le temps total dexcution est linaire

    (O(N))

    Pour un tableau tri dans lordre inverse: Pour les N trs grand, le tri est slection est le

    plus rapide, suivi du tri par bulles cause du fait quil fait les changes entre deux lmentsadjacents tandis que le tri par Insertion fait des mouvements sur tout le tableau chaque

    fois si un lment nest pas la bonne place.

    Parmi ces quatre tris lmentaires, le tri Shell est le choix idal faire pour beaucoup

    dapplications de tri parce quil a un temps dexcution raisonnable quelque soit le type de

    tableau trier.

    Vu limportance des tris dans plusieurs domaines, il existe des mthodes de tri plus

    performantes que les tris lmentaires, leur fonctionnement fera le sujet des paragraphes

    suivants.

    30

  • 7/23/2019 ramatouFinal

    31/54

    3. TRIS SOPHISITIQUES OU COMPLEXES

    Quand les lments du tableau associs aux cls sont grands, les tris lmentairesdeviennent mauvais. Mais il existe des tris plus volus qui prsentent des complexits en

    O(NlogN) en moyenne et mme dans le pire des cas en ce qui concerne le tri par tas

    (heapsort en anglais) : ce sont lestris sophistiqus.

    3.1 Tri Rapide (quiksort)

    La version initiale de lalgorithme quicksort a t invente en 1962 par C. A. R. Hoare. Il

    doit son nom au fait quil est lun des algorithmes de tri connus les plus rapides. Il

    fonctionne bien pour de nombreux types de donnes en entre.

    Lalgorithme du tri rapide a pour avantage de se faire sur place (il transforme une

    structure de donnes en utilisant une quantit de mmoire supplmentaire minimale et

    constante, les entres sont crases par les sorties)

    3.1.1 Mthode et ImplmentationOn choisit un lment arbitraire b appel le pivot parmi les lments du tableau. On

    subdivise le tableau en deux sous tableaux, S1 contient les lments du tableau qui sont

    plus petits ou gaux au pivot et dans S2, les lments du tableau qui sont plus grands ou

    gaux au pivot. Lalgorithme de tri rapide est ensuite appliqu rcursivement ces deuxsous suites. Si un sous tableau contient un lment, on ne fait rien.

    Un sous tableau du tableau original est dtermin de faon unique par deux indices i et j

    (voir limplmentation ci-dessus). A chaque appel rcursif de la mthode quicksort, nous

    appelons la routine en spcifiant l (de llment de plus gauche) et r (de llment de plus

    droit).

    Comment crer les sous tableaux:

    Pour le tri rapide implment dans ce projet, nous avons utilis la stratgie gnrale

    suivante pour la mthode de partition. On choisit arbitrairement a[r] pour quil soit le

    pivot de la partition. Il ira donc sa place finale. On parcourt ensuite le tableau en partant

    de la gauche jusqu ce quon trouve un lment plus grand que le pivot, de mme on

    parcourt le tableau en partant de la droite jusqu ce quon trouve un lment plus petit quele pivot. Ces deux lments ntant pas leur place, on les permute. En continuant de cette

    manire, on sassure quaucun lment du tableau gauche de lindice de gauche nest plus

    grand que le pivot et quaucun lment du tableau droite de lindice droit nest plus petit

    que le pivot, comme dcrit dans le diagramme suivant.

    Plus petit ou gal v Plus grand ou gal v V

    l i j r-1

    31

  • 7/23/2019 ramatouFinal

    32/54

    Lorsque les indices se croisent, on complte le processus de partition en changeant a[r-1]

    avec llment le plus gauche de la partie de la partie droite du sous tableau (cest--direllment dont le rang est gal lindice de gauche: a[i] et a[r-1]).

    Code en Langage C de la mthode quicksort

    #include "partition.cpp"

    void quickSort(int* a, int l, int r,long long *echanges, long long

    *comparaisons){

    if (r a[r-1])

    {

    swap(a,l,r-1);

    (*echanges)++;

    }

    return;

    }

    if (r >= l+3)

    int k= partition(a,l,r,echanges,comparaisons);

    quickSort(a,l, k,echanges,comparaisons);

    quickSort(a,k+1,r,echanges,comparaisons);

    }

    }

    Code en Langage C de la mthode partition

    //#include "swap.cpp"

    int partition(int* a, int l, int r , long long *echanges, long long

    *comparaisons){

    int i = l;

    int j = r-1;

    int pivot = a[r-1];

    while (i < j)

    {

    (*comparaisons)++;while(a[j]>=pivot && j > l){

    32

  • 7/23/2019 ramatouFinal

    33/54

    j--;

    (*comparaisons)++;

    }

    (*comparaisons)++;

    while (a[i]

  • 7/23/2019 ramatouFinal

    34/54

    Voici un exemple de tri rapide (quicksort)

    3.2.2 Analyse et performance du Thoriques du QuicksortMalgr ses nombreux atouts, le programme du tri rapide tendance tre

    inefficace pour certains tableaux.

    Nombre de comparaisons et Nombre de mouvements

    34

  • 7/23/2019 ramatouFinal

    35/54

    Si on lexcute, par exemple, sur un tableau tri dans lordre inverse ou presque tri, de

    taille N, toutes les partitions sont dgnres et le programme sappelle N fois, en enlevant

    seulement un lment chaque appel (le pivot). Ainsi le nombre de comparaisons dans le

    pire des cas est:

    MaxC(N)=N+ (N-1)+(N-2)+.+2+1 =(N+1)N/2La complexit en comparaisons et en mouvement dans le pire des cas est :

    MaxC(N)= MaxM(N)=(N^2)

    Le cas le plus favorable au tri rapide est celui dans lequel ltape de partition scinde le

    tableau exactement en deux. Cela permet au nombre de comparaisons effectues de vrifier

    lquation de rcurrence propre au principe diviser pour rgner :

    MinC(N)=2*MinC(N/2) + N

    Le terme 2*MinC(N/2) correspond au cot du tri des deux sous tableaux et N celui de

    lexamen de chaque lment cause de lutilisation de lindice de partition. Cette quation

    de rcurrence admet comme solution :MinC(N) ~N/log(N)

    Le nombre de mouvements en meilleur des cas est 0 :

    MinM(N)=0

    Dans le meilleur des cas, On en dduit que la complexit est :

    MinC(N)=O(NlogN)

    Dans le cas moyen, le nombre de comparaisons et mouvements effectus par le tri rapide

    est de lordre de 2Nln(N).

    Il est signaler que les complexits en nombre de mouvements sont du mme ordre ou

    dordre infrieur, car on change trs peu dans lalgorithme mais la comparaison reste trscoteuse pour ce tri.

    Bien que la ralit ne corresponde pas toujours la thorie, il est vrai que les pivots

    partagent les tableaux au centre en moyenne. La prise en compte de la probabilit exacte de

    chaque de chaque position du pivot complique la relation de rcurrence, mais le rsultat

    final est similaire.

    3.2.3 Rsul tats des Tests Effectus

    -Voir annexe 5

    3.1.4 Courbes Obtenus

    35

    QuickSort

    1.00000

    100.00000

    10000.00000

    1000000.00000

    1 10 100 1000 10000 100000

    t[m

    s]

    0.01000

    N

    tableau nontri

    Tableau tridans l'ordreinverseTableaupresque tri

  • 7/23/2019 ramatouFinal

    36/54

    Quicksort

    0.000001

    0.00001

    0.0001

    0.001

    0.01

    0.1

    1

    1 100 10000 1000000 10000000

    0

    N

    K

    Tableau non tri (moyen

    des cas) K=Temps / NlogN

    Tableau tri dans l'ordre

    inverse (pire des cas)

    K=Temps / N^2

    Tableau presque tri(pire

    des cas ) K=Temps/N^2

    3.1.5 Observations et Conclusions sur lAlgor ithme du Quicksort

    Comportement du tri rapide en face de diffrentes entres possibles :

    On peut aussi remarquer quen dessous dune certaine taille des tableaux, le cot en temps

    et en place des appels rcursifs devient significatif par rapport aux nombres de

    comparaisons. Au-dessous dun certain seuil, il devient plus avantageux dutiliser la

    version itrative dune mthode de tri simple (tri par Slection par exemple).

    Exprimentalement on saperoit que la valeur de ce seuil est de lordre de 10.

    Notons que le tri rapide est quasiment 3 fois plus rapides que le tri shell.

    Contrairement au tri par tas, le tri rapide ncessite une pile auxiliaire de (mmoire) de taille

    maximum log (N).

    La performance du tri rapide dpend du choix du pivot. Durant le projet, Nous avons

    essay quelques stratgies de pivots tel que trois-mdiane et neuf-mdiane.

    Pendant le test dexcution, on sest rendu compte que la stratgie des neufs na aucun

    intrt, au lieu damliorer les performances du tri rapide, elle la dtriore. Ceci se justifie

    par le calcul des neufs mdianes qui est compliqu par consquent la mthode prend du

    temps. Cependant la stratgie trois mdiane quon abordera au paragraphe suivant est

    dune grande importance.

    3.2 Tri Trois-Mediane : Amlioration du tri rapide par lastratgie du choix du pivot

    Pour viter les cas limites pour lesquels la complexit au pire du nombre de comparaisons

    est en O(N^2).On peut, par exemple chercher le trois- mdianes du tableau (C'est--dire ,le

    premier lment du tableau, llment milieu et le dernier lment .On tri ces trois lments

    et on prend comme pivot llment milieu des trois.

    36

  • 7/23/2019 ramatouFinal

    37/54

    3.2.1 Mthode et Implmentation

    Ce tri rapide amlior la mme implmentation que quicksort, sauf que le pivot ici est

    trois-mediane. Le principe de diviser le tableau en 2 sous tableaux chaque tape reste lemme.

    Les expriences que nous avons faites sur diffrentes entres possibles montrent que la

    stratgie trois-mediane et la limite sur les petits sous tableaux rduisent encore plus le

    temps dexcution du tri rapide.

    Code en langage C de la mthode partition

    #include "getmedian.cpp"

    int partition(int* a, int l, int r , long long *echanges, long long *comparaisons){

    int p = r-1;

    int q = l;

    int pivot;

    int medIndex = getMedian(a[l], a[(r-1+l)/2], a[r-1]);

    if (medIndex == 1)

    medIndex = l;

    if (medIndex == 2)

    medIndex = (l+r-1)/2;

    if (medIndex == 3)

    medIndex = r-1;

    swap(a,medIndex,r-1);

    (*echanges)++;pivot = a[r-1];

    while (q < p)

    {

    //(*comparaisons)++;

    while (a[p] >= pivot && p > l){

    p--;

    (*comparaisons)++;

    }

    //(*comparaisons)++;

    while (a[q]

  • 7/23/2019 ramatouFinal

    38/54

    }

    }

    swap(a,q,r-1);

    (*echanges)++;return q;

    }

    Code en Langage C de la mthode partition

    #include "partition.cpp"

    void quickSort3Median(int* a, int l, int r ,long long *echanges, long

    long *comparaisons)

    {

    if (r a[r-1])

    {

    swap(a,l,r-1);

    (*echanges)++;

    }

    return;

    }

    if (r >= l+3)

    {

    int k= partition(a,l,r,echanges,comparaisons);

    quickSort3Median(a,l,k,echanges,comparaisons);

    quickSort3Median(a,k+1,r,echanges,comparaisons);

    }

    }

    3.2.2 Analyse et performance Thoriques du TriTrois-Mediane

    38

  • 7/23/2019 ramatouFinal

    39/54

    Cest quasiment, le mme analyse que pour le tri rapide (quickSort). Ils ont pas consquent

    les mmes complexits. Certes on a remarqu lors de nos diffrents tests quil est plus

    rapide que quicksort car il fait moins de comparaisons et de mouvements. Mais ce nest pas

    une raison pour quils aient des complexits diffrentes.

    3.2.3 Rsul tats des Tests Effectus-Voir annexe 6

    3.2.4 Courbes Obtenus

    3Mediane

    0.000000

    5000.000000

    10000.000000

    15000.000000

    20000.000000

    25000.000000

    30000.000000

    1 100 10000 1000000 1000000

    00

    N

    t(

    ms)

    Tableau non tri (moyen

    des cas)Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    3Mediane

    0.00E+00

    1.00E-05

    2.00E-05

    3.00E-05

    4.00E-05

    5.00E-05

    6.00E-05

    1 100 10000 1000000 10000000

    0

    N

    K

    Tableau non tri (moyen

    des cas) K=Temps / NlogN

    Tableau tri dans l'ordre

    inverse (pire des cas)

    K=Temps / N^2

    Tableau dj tri (meilleur

    des cas) K=Temps / NlogN

    39

  • 7/23/2019 ramatouFinal

    40/54

    3Mediane

    0

    1000000000

    2000000000

    3000000000

    4000000000

    5000000000

    6000000000

    1 100 10000 1000000 1E+08

    N

    NbreEchange-

    comparaiso

    nTableau non tri (moyen

    des cas)Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    3Mediane

    0.400000

    0.600000

    0.800000

    1.000000

    1.200000

    1.400000

    breEchange

    mparaison/log

    0.000000

    0.200000

    1 100 10000 1000000 1E+08

    N

    Nco

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    3.2.5 Observations et Conclusions sur l Algorithme du Tri 3-mediane

    Les tests effectus sur le tri 3-mediane nous a prouv quil est deux fois plus

    rapide que quicksort. En plus il amliore nettement la dgnrescence de

    quicksort dans le pire des cas (avec un tableau presque tri ou tri dans

    lordre inverse)

    3.3 Tri par Tas (Heapsort)

    Cest une structure de donnes simples, appele tas (heap en Anglais), qui permet de grer

    efficacement les oprations de bases des files priorit.

    Les enregistrements dun tas sont stocks dans un tableau dans lequel chaque cl estgarantie suprieure celle situes deux autres positions spcifiques. Ces dernires sont

    40

  • 7/23/2019 ramatouFinal

    41/54

    leur tour chacune suprieure deux autres cls, etc. Ce rangement est visualisable sous

    forme dun arbre binaire ayant des artes (liens) menant de chaque nud aux deux nuds

    infrieurs.

    3.3.1 Mthode et Implmentation

    Limplmentation de cet algorithme utilise comme mthodes:

    -Le SiftDown:

    La procdure de sifts est une procdure efficace qui peut tre utilise pour insrer des

    lments dans un heap, ou pour enlever des lments. Il existe deux techniques de sifting:

    le sift up et le sift down

    Mais dans ce projet on utilise le sift down qui fonctionne de la manire suivante :

    Etant donne un heap dans sa reprsentation implicite dans la forme dun tableau a avec N

    lments, nous faisons un sift down de llment avec indice i comme suit :

    Si le sommet i est une feuille (cest--dire quil na pas de fils) ou sil est plus grand que sesdeux fils on ne fait rien. Sinon on change le sommet i avec le plus grand de ses fils et on

    recommence ce procd de faon rcursive

    -Le BottomUpHeapCreate:

    Elle permet de crer un heap(tas) partir du tableau de longueur N en utilisant la mthode

    SifDown

    -HeapSort

    Comme on a un tas, on est sr que llment a[0] est le plus grand lment du tableau.

    Ainsi chaque tape i>=1,nous remplaons la racine de larbre courant (i.e.,a[0])avec a[N-

    1], et nous faisons un siftdown de llment a[0] dans larbre donn par les lments

    a[0],.,a[N-i-1].

    La mthode implique trois phases :

    Un tableau a de longueur N peut tre considr comme un arbre binaire avec racine

    de la faon suivante (reprsentation implicite) : les sommets de larbre

    correspondent aux positions 0, 1,2,.N-1

    La racine est la position 0, et pour tout sommet i, ses fils sont en positions 2i+1 et

    2i+2, condition que ces valeurs soient plus petites que N.

    - Construction du tas (heap) partir de larbre binaire

    Ce tableau est un tas(heap) si :

    a[i]>=a[2i+1] et a[i]>=a[2i+2 ] avec 2i , 2i+1

  • 7/23/2019 ramatouFinal

    42/54

    - Une fois quon a un tas, on peut appliquer maintenant la mthode qui consiste qui

    consiste changer la racine avec le dernier lment du tas. Cette manire de faire

    est dun grand intrt car on sait que llment maximal du tableau se trouve la

    racine. Ds lors on a plus un tas, on le reconstruit de nouveau en siftant depuis la

    racine jusquen lavant dernier lment quon vient de dplacer en bas de larbre.

    (c'est--dire on descend llment de la racine tout en vrifiant chaque noeud, la

    proprit dun heap. On reprend le mme principe jusqu ce quil reste un seul

    lment dans larbre. Ce nest pas toujours facile de dfinir un mthode trsclairement, on voit mieux sur lexemple ci-dessous.

    42

  • 7/23/2019 ramatouFinal

    43/54

    Voici une tape dapplication de heapsort (tri par tas) dcrit ci-dessus

    Code en langage C de la mthode HeapSort

    #include "SiftDown.cpp"

    43

  • 7/23/2019 ramatouFinal

    44/54

    #include "TopDownHeapCreate.cpp"

    void HeapSort(int *a, int N,long long *comparaisons,long long *echanges) {

    TopDownHeapCreate(a,N,comparaisons,echanges);

    for (int i = N-1 ;i>=1 ; i--){

    swap(a,0,i,echanges);

    SiftDown(a,0,i-1,comparaisons,echanges);

    }

    }

    Code en langage C de la mthode BottomUpHeapCreate

    void BottomUpHeapCreate(int*a,int N){

    int i;

    for (i =floor((N-1)/2);i

  • 7/23/2019 ramatouFinal

    45/54

    while (Swapped && i>=0 && ia[2*i+2]){

    (*comparaisons)++;

    j= 2*i+1;}

    else

    j= 2*i+2;

    if(2*i+2 >= ind_max){

    (*comparaisons)++;

    j=2*i+1;

    }

    if(2*i+1 >= ind_max){

    (*comparaisons)++;j=i;

    }

    if (a[i]

  • 7/23/2019 ramatouFinal

    46/54

    3.3.3 Rsul tats des Tests Effectus

    -Voir annexe 7

    3.3.4 Courbes Obtenus

    Heapsort

    0

    10000000

    20000000

    30000000

    40000000

    50000000

    60000000

    70000000

    80000000

    1 100 10000 1000000

    N

    NbreEchange-

    Comparaison

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    Heapsort

    0.0000001.0000002.0000003.0000004.0000005.0000006.0000007.0000008.0000009.000000

    1 100 10000 1000000

    N

    NbreEchange-

    Comparaison

    /NlogN

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    46

  • 7/23/2019 ramatouFinal

    47/54

    0.01000

    0.10000

    1.00000

    10.00000

    100.00000

    1000.00000

    10000.00000

    1 100 10000 1000000

    Taille du tableau

    temps(m

    s)

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    0.000000

    0.010000

    0.020000

    0.030000

    0.040000

    0.050000

    0.060000

    0.070000

    0.080000

    1 100 10000 1000000

    N

    t(ms)/Nlog-n

    Tableau non tri (moyen

    des cas)

    Tableau tri dans l'ordre

    inverse (pire des cas)

    Tableau dj tri (meilleur

    des cas)

    3.3.5 Observations et Conclusions sur lAlgorithme du Heapsort

    Le tri par tas est une technique de tri qui est comparable au tri rapide (quicksort) pour le

    temps moyen. Lutilisation dun tas permet de trier N lments en temps de lordre de

    Nlog(N), indpendamment de la nature des donnes (ici des tableaux) O(NlogN), ceci

    sans mmoire auxiliaire car on peut utiliser le tableau trier pour reprsenter le tas.

    Les tests effectus sur le heapsort nous permet de conclure quil est devient mauvais sur des

    tableaux presque tri, ce se justifie par son fonctionnement. On pourrait donc penser une

    amlioration de cet algorithme en tenant compte si certains sommets sont bien placs.

    47

  • 7/23/2019 ramatouFinal

    48/54

    3.4 Comparaisons des Tris Sophistiqus

    NLog(N) Sorting

    0.00000

    200.00000

    400.00000

    600.00000

    800.00000

    1000.00000

    1200.00000

    1400.00000

    0 5000

    0

    1000

    00

    1500

    00

    2000

    00

    2500

    00

    3000

    00

    3500

    00

    4000

    00

    4500

    00

    5000

    00

    5500

    00

    6000

    00

    N

    Tmoy

    QuickSort

    3-Mediane

    HeapSort

    Tout ce qui suit se rsume sur la courbe de NlogNSorting ci-dessus.

    Bien entendu, il sagit de savoir quand choisir le tri par tas, le tri rapide ou le tri 3-mdiane

    pour telle ou telle application. Le choix entre heapsort et tri rapide (quicksort) revient

    privilgier les performances dans le cas moyen ou dans le pire des cas. En gnral, rendre

    heapsort plus rapide que quicksort nest pas gagn davance car la version amliorer dequicksort (3-mdiane) relve ce dfi.

    Les rsultats des tests empiriques en annexe montrent que heapsort est plus lent que

    quicksort dans le moyen des cas mais il est mieux de choisir heapsort pour les types de

    tableaux tris dans lordre inverse o quicksort dgnre en O(N^2).

    4. CONCLUSION GENERALE

    Durant le projet, diffrents algorithmes de tri ont t tudis et compars. La question qui

    se pose maintenant est de dterminer si lon peut esprer trouver une mthode de tri

    meilleure que toutes les autres. Ce nest pas aussi simple. Il faut videmment prciser le(ou les) critre(s) selon le(s)quel(s) on compare les mthodes et pour quelles mthodes ce

    critre est significatif.

    Pour obtenir des rsultats intressants, on va se restreindre la classe Tc des algorithmes de

    tri qui oprent uniquement par comparaisons deux deux des cls des lments trier. De

    plus, on fait lhypothse que toutes les cls du tableau trier sont diffrentes.

    Dans ces conditions, comme le confirme les diffrents tests exprimentaux,on en dduit

    que :

    La complexit, en nombre de comparaisons, aussi bien en moyenne quau pire, de tout

    algorithme de la classe Tc est dordre de grandeur suprieur ou gal Nlog(N) .

    On peut en dduire que les algorithmes de tri rapide(quicksort) et tri par tas(heapsort) sont

    optimaux en moyenne; le tri par tas est de plus optimal dans le cas le pire(une entre detableaux tris dans lordre inverse). Mais ceci est vrai seulement partir dune certaine

    48

  • 7/23/2019 ramatouFinal

    49/54

    valeur de la taille du tableau. Par consquent, il est important de savoir quon ne gagne pas

    grande chose utiliser les tris compliqus (rapides) pour trier les tableaux qui ont moins

    dune centaine dlments.

    Pour analyser les algorithmes de tri, on sest bas sur deux oprations fondamentales: les

    comparaisons et les mouvements. Le rsultat nonc ci-dessus porte seulement sur les

    comparaisons. Le nombre de mouvements ne doit pas tre nglig pour autant : Si onconsidre par exemple le tri par Insertion, il est optimal dans le pire des cas en nombre de

    comparaisons mais le nombre de transfert est en O(N^2). Pratiquement le temps total

    dexcution de lalgorithme est proportionnel N^2.

    Le tri par Shell requiert peu de code et se montre comptitif pour des tableaux de grandes

    tailles en face des tris performants (quicksort, tri par tas) qui sont deux fois plus rapides,

    except pour de grands N mais qui sont beaucoup plus complexes implmenter.

    En rsum si vous avez besoin dune solution rapide pour un problme de tri et que vous

    ne voulez pas vous occuper de linterfaage dun systme de tri, vous pouvez utiliser le tri

    shell et reporter plus tard le travail supplmentaire pour une mthode plus sophistique.

    Pour mieux voir le comportement des divers algorithmes tudis dans ce projet dans le pire

    des cas, moyen des cas et meilleur des cas, on a procd une reprsentation sous forme

    dhistogramme ci-dessous.

    49

  • 7/23/2019 ramatouFinal

    50/54

    Tableau non tri pour N=100000

    Tmoy Bubble; 25827.4

    Tmoy Selection; 9662.3Tmoy Insertion; 8510.4

    Tmoy Heapsort; 99.8

    Tmoy QuickSort; 18.6

    Tmoy 3Mediane; 7.9

    0

    5000

    10000

    15000

    20000

    25000

    30000

    100000

    Temps

    Tmoy Bubb

    Tmoy Sele

    Tmoy Inser

    Tmoy Heap

    Tmoy QuicTmoy 3Me

    50

  • 7/23/2019 ramatouFinal

    51/54

    Tableau tr i en sens inverse pour N=100000

    Tmax Bubble; 30946

    Tmax Selection; 10632

    Tmax Insertion; 17095

    Tmax Heapsort; 91.2

    Tmax QuickSort;

    10448.9

    Tmax 3Mediane; 16.80

    5000

    10000

    15000

    20000

    25000

    30000

    35000

    100000

    Temps

    Tmax Bubble

    Tmax Selection

    Tmax Insertion

    Tmax Heapsort

    Tmax QuickSort

    Tmax 3Mediane

    51

  • 7/23/2019 ramatouFinal

    52/54

    Tableau no n tr i (alatoire ) pour N=250

    Tmoy Bubble; 1

    Tmoy Selection; 0.3

    Tmoy QuickSort; 0.1

    Tmoy Insertion; 0.2Tmoy Heapsort; 0.2

    Tmoy 3Mediane; 0.1

    0

    0.2

    0.4

    0.6

    0.8

    1

    1.2

    250

    Temps

    Tmoy Bubble

    Tmoy Selection

    Tmoy Insertion

    Tmoy Heapsort

    Tmoy QuickSort

    Tmoy 3Mediane

    Tableau non tri (alatoire) pour N=250

    Tmoy Bubble; 1

    Tmoy Selection; 0.3

    Tmoy QuickSort; 0.1

    Tmoy Insertion; 0.2Tmoy Heapsort; 0.2

    Tmoy 3Mediane; 0.1

    0

    0.2

    0.4

    0.6

    0.8

    1

    1.2

    250

    Temps Tmoy Bubb

    Tmoy Sele

    Tmoy Inser

    Tmoy Hea

    Tmoy Quic

    Tmoy 3Me

    52

  • 7/23/2019 ramatouFinal

    53/54

    5. ANNEXE DES RESULTATS DES TESTS

    -

    Annexe1 : Rsultats des tests de Tri Bulles(BubbleSort)

    -

    Annexe2 : Rsultats des tests de Tri par Slection(SelectionSort)- Annexe1 : Rsultats des tests de Tri par Insertion(InsertionSort)

    - Annexe1 : Rsultats des tests de Tri par Shell (ShellSort)

    - Annexe1 : Rsultats des tests de Tri rapide(quickSort)

    - Annexe1 : Rsultats des tests de Tris trois-mdiane(three-median)

    - Annexe1 : Rsultats des tests de Tri par tas(heapSort)

    53

  • 7/23/2019 ramatouFinal

    54/54