IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Algorithme de Tri pour Tableau multidimenssion


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Algorithme de Tri pour Tableau multidimenssion
    Bonjour,

    Je cherche à trier un tableau multidimensionnel par rapport à une colonne.
    Le problème c'est que mon tableau est tres grand et du coup le temps d'execusion de mon code ci dessous est bloquant ( plus de 4h) je precise que mon tableau est dynamique avec une taille de minimum ( 365000,13) c'est la premiere dimension qui varie.

    D'où ma demande : Est ce que quelqu un pour ne filer un code pour faire le tri plus rapide que le mien.

    Voici mon code qui marche tres bien en cas de peu de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Sub TriInsertionStrings(TableauATrier() As Variant, ByVal ColonneTri As Long, _
                                  ByVal lDebutTableau As Long, _
                                  ByVal lFinTableau As Long)
     
        Dim sValeur()  As Variant
        Dim lCount1 As Long
        Dim lCount2 As Long
        Dim lCptCol  As Long
     
        ReDim sValeur(UBound(TableauATrier, 2))
        'Parcours les éléments
        For lCount1 = lDebutTableau + 1 To lFinTableau
            For lCptCol = 0 To UBound(TableauATrier, 2)
                sValeur(lCptCol) = TableauATrier(lCount1, lCptCol)
            Next lCptCol
     
     
     
            'Trouve la place pour mettre l'élément
            For lCount2 = lCount1 - 1 To lDebutTableau Step -1
                If TableauATrier(lCount2, ColonneTri) < sValeur(ColonneTri) Then
                    Exit For
                End If
                For lCptCol = 0 To UBound(TableauATrier, 2)
                    TableauATrier(lCount2 + 1, lCptCol) = TableauATrier(lCount2, lCptCol)
                Next lCptCol
            Next lCount2
     
            ' Insert it
            For lCptCol = 0 To UBound(TableauATrier, 2)
                TableauATrier(lCount2 + 1, lCptCol) = sValeur(lCptCol)
            Next lCptCol
        Next
    End Sub
    Merci pour votre aide

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Salut,
    Des notes que j'ai dans mes archives, sur les tris.
    Je ne sait plus où j'ai récuperer ça. Ce sont les tris les plus connus et les plus efficaces. jette un oeil là :
    Based on original code : http://www.vb-helper.com/howto_quicksort.html

    Le Tri de Shell (Shell Sort)
    Sur le principe, le Tri de Shell (du nom de son inventeur, Donald L.Shell, qui l'a proposé en 1952) est un tri par insertion. Son fonctionnement est assez complexe, et la détermination exacte de son temps d'exécution est un problème compliqué. En pratique, c'est un algorithme extrêmement efficace. On peut l'utiliser pour trier des tableaux contenant des centaines de milliers de données.
    Pour donner un ordre de grandeur, disons que l'on peut trier un tableau entièrement désordonné de 350.000 éléments en moins d'une seconde. Par comparaison, il faudrait plus de 7 heures à un tri à bulle pour faire le même travail (environ 28000 fois plus de temps!).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    ' Tri de Shell - Shell Sort  
    '  
    Public Sub ShellSort(t() As Long, _  
                        Optional ByVal loBound As Long = -1, _  
                        Optional ByVal upBound As Long = -1)  
     
        Dim i As Long, j As Long, h As Long, v As Long  
     
        If loBound = -1 Then  
            loBound = LBound(t())  
        End If  
        If upBound = -1 Then  
            upBound = UBound(t())  
        End If  
     
        h = loBound  
        Do  
            h = 3 * h + 1  
        Loop Until h > upBound  
     
        Do  
            h = h / 3  
            For i = h + 1 To upBound  
                v = t(i): j = i  
                Do While t(j - h) > v  
                    t(j) = t(j - h): j = j - h  
                    If j <= h Then  
                        Exit Do  
                    End If  
                Loop  
                t(j) = v  
            Next i  
        Loop Until h = loBound  
    End Sub
    Le Tri rapide (Quick Sort)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    '  Quick Sort  
    ' Based on original code : http://www.vb-helper.com/howto_quicksort.html   
    ' 
    Public Sub Quicksort(t() As Long, _  
                        ByVal loBound As Long, _  
                        ByVal upBound As Long)  
     
        Dim med_value As Long  
        Dim hi As Long  
        Dim lo As Long  
        Dim i As Long  
     
        If loBound >= upBound Then Exit Sub  
        i = Int((upBound - loBound + 1) * Rnd + loBound)  
        med_value = t(i)  
        t(i) = t(loBound)  
        lo = loBound  
        hi = upBound  
        Do  
            Do While t(hi) >= med_value  
                hi = hi - 1  
                If hi <= lo Then Exit Do  
            Loop  
            If hi <= lo Then  
                t(lo) = med_value  
                Exit Do  
            End If  
            t(lo) = t(hi)  
            lo = lo + 1  
            Do While t(lo) < med_value  
                lo = lo + 1  
                If lo >= hi Then Exit Do  
            Loop  
            If lo >= hi Then  
                lo = hi  
                t(hi) = med_value  
                Exit Do  
            End If  
            t(hi) = t(lo)  
        Loop  
        ' Recursive calls  
        Quicksort t(), loBound, lo - 1  
        Quicksort t(), lo + 1, upBound  
    End Sub

Discussions similaires

  1. [XL-2003] Algorithme de Tri pour Tableau multidimension
    Par rabbitnator3000 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/06/2012, 10h56
  2. Tri sur tableau multi pour génération de jointures SQL
    Par Djakisback dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 21/09/2007, 14h58
  3. Réponses: 0
    Dernier message: 07/08/2007, 07h42
  4. Algorithme de recherche pour un tableau
    Par bourgot dans le forum Mathématiques
    Réponses: 1
    Dernier message: 23/05/2007, 18h34
  5. algorithme de tri tableau :afficher que les éléments unique
    Par sofiane61 dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 31/03/2005, 19h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo