Trier en place un tableau statique imbriqué (Structure)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Trier en place un tableau statique imbriqué (Structure)

Message par Guimauve »

Bonjour à tous,

Voilà, tout est dans le titre. Donc sans plus attendre voiçi l'exemple en question.

Les algorythmes de trie ne sont pas très rapide (Bubble Sort).
Ils sont efficaces sur de petits tableaux [n] < 50 chaînes.

Plus de 50 éléments, c'est à vos risques et périls.
(Pas de plantage, juste 2 à 3 heures pour trier le tableau)

Il est important de mentionner que ce code n'est rien d'autre qu'un prototype.
J'étudie un moyen de rendre le tout plus rapide mais pour l'instant, ça marche pas.

Et mille excuse, c'est en anglais.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code generated by : Dev-Type
; Project name : Sort string in place exemple
; File name : StringSort in place.pb
; File Version : 1.0.0
; Programmation : Experimental code
; Programmed by : Guimauve
; Creation Date : 05-11-2006
; Last update : 05-11-2006
; Coded for PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes : Heros
;
; This code it's just a test for sorting string in
; place inside a Structure static array. 
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<< !!! WARNING !!! <<<<<<<<<<<<<<<<<
;
; THE SORTING TECHNICS IS BASED ON BUBBLE SORT.
; IT'S GOOD FOR SMALL ARRAY [n] < 50. MORE REASERCH
; IS NEEDED FOR BETTER PERFORMANCE ON LARGE STATIC 
; ARRAY.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Size Array Constants <<<<<

#HEROS_NAME_MAX = 15

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<

Structure Heros
  
  Name.s[#HEROS_NAME_MAX]
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<

Macro SetHerosName(HeroA, Index, Name_String)
  
  HeroA\Name[Index] = Name_String
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<

Macro GetHerosName(HeroA, Index)
  
  HeroA\Name[Index]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< StringSort Ascendant operator <<<<<

Procedure StringSortAscendantHerosName(*HeroA.Heros)
  
  StringSortSwapped.b = #True
  
  While StringSortSwapped = #True
    
    StringSortSwapped = #False
    
    For Index = #HEROS_NAME_MAX - 1 To 1 Step -1
      
      LenString01 = Len(GetHerosName(*HeroA, Index))
      LenString02 = Len(GetHerosName(*HeroA, Index - 1))
      
      If LenString01 > LenString02
        LenMin = LenString02
      ElseIf LenString01 < LenString02
        LenMin = LenString01
      Else
        LenMin = LenString01
      EndIf
      
      For CharIndex = 0 To LenMin
        
        AsciiString01 = Asc(UCase(Mid(GetHerosName(*HeroA, Index), CharIndex, 1)))
        AsciiString02 = Asc(UCase(Mid(GetHerosName(*HeroA, Index - 1), CharIndex, 1)))
        
        If AsciiString01 > AsciiString02
          SwapNeeded.b = -1
          Break
        ElseIf AsciiString01 < AsciiString02
          SwapNeeded = 1
          Break
        EndIf
        
      Next
      
      If SwapNeeded = 0
        If LenString01 < LenString02
          SwapNeeded = 1
        EndIf
      EndIf
      
      If SwapNeeded = 1
        Swap GetHerosName(*HeroA, Index), GetHerosName(*HeroA, Index - 1)
        StringSortSwapped = #True
        SwapNeeded = 0
      EndIf
      
    Next
    
  Wend
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< StringSort Descendant operator <<<<<

Procedure StringSortDescendantHerosName(*HeroA.Heros)
  
  StringSortSwapped.b = #True
  
  While StringSortSwapped = #True
    
    StringSortSwapped = #False
    
    For Index = 0 To #HEROS_NAME_MAX - 2
      
      LenString01 = Len(GetHerosName(*HeroA, Index))
      LenString02 = Len(GetHerosName(*HeroA, Index + 1))
      
      If LenString01 > LenString02
        LenMin = LenString02
      ElseIf LenString01 < LenString02
        LenMin = LenString01
      Else
        LenMin = LenString01
      EndIf
      
      For CharIndex = 0 To LenMin
        
        AsciiString01 = Asc(UCase(Mid(GetHerosName(*HeroA, Index), CharIndex, 1)))
        AsciiString02 = Asc(UCase(Mid(GetHerosName(*HeroA, Index + 1), CharIndex, 1)))
        
        If AsciiString01 > AsciiString02
          SwapNeeded.b = -1
          Break
        ElseIf AsciiString01 < AsciiString02
          SwapNeeded = 1
          Break
        EndIf
        
      Next
      
      If SwapNeeded = 0
        If LenString01 < LenString02
          SwapNeeded = 1
        EndIf
      EndIf
      
      If SwapNeeded = 1
        Swap GetHerosName(*HeroA, Index), GetHerosName(*HeroA, Index + 1)
        StringSortSwapped = #True
        SwapNeeded = 0
      EndIf
      
    Next
    
  Wend
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Copy operator : A = Source : B = Destination <<<<<

Macro CopyHeros(HeroA, HeroB)
  
  For Index = 0 To #HEROS_NAME_MAX - 1
    SetHerosName(HeroB, Index, GetHerosName(HeroA, Index))
  Next

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Debugging macro <<<<<

Macro DebugHeros(HeroA)
  
  For Index = 0 To #HEROS_NAME_MAX - 1
    Debug GetHerosName(HeroA, Index)
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.047 seconds <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We fill Myheros structure with names. <<<<<

MyHeros.Heros

SetHerosName(MyHeros, 00, "Zoro")
SetHerosName(MyHeros, 01, "SuperMan")
SetHerosName(MyHeros, 02, "SpiderMan")
SetHerosName(MyHeros, 03, "Freak")
SetHerosName(MyHeros, 04, "Morpheus")
SetHerosName(MyHeros, 05, "Fred")
SetHerosName(MyHeros, 06, "Athena")
SetHerosName(MyHeros, 07, "Zeus")
SetHerosName(MyHeros, 08, "Hercule")
SetHerosName(MyHeros, 09, "Achille")
SetHerosName(MyHeros, 10, "Luke")
SetHerosName(MyHeros, 11, "Anakin")
SetHerosName(MyHeros, 12, "Mace Windu")
SetHerosName(MyHeros, 13, "Yoda")
SetHerosName(MyHeros, 14, "Obiwan")

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We copy MyHeros to test the sort commands on the same duty. <<<<<

CopyHeros(MyHeros, MyHerosCopy00.Heros)
CopyHeros(MyHeros, MyHerosCopy01.Heros)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We run the test <<<<<

Debug "MyHeros original list"
DebugHeros(MyHeros)
Debug ""

Debug "MyHeros Sorted Ascendant"
StringSortAscendantHerosName(MyHerosCopy00)
DebugHeros(MyHerosCopy00)
Debug ""

Debug "MyHeros Sorted Descendant"
StringSortDescendantHerosName(MyHerosCopy01)
DebugHeros(MyHerosCopy01)
Debug ""

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Une version plus performante.

@Comtois : Merci pour l'exemple d'Arbre binaire sur ton site. Je m'en suis inspiré pour la comparaison des chaines de caractères.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Size Array Constants <<<<<

#HEROS_NAME_MAX = 15

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<

Structure Heros
  
  Name.s[#HEROS_NAME_MAX]
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<

Macro SetHerosName(HeroA, Index, Name_String)
  
  HeroA\Name[Index] = Name_String
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<

Macro GetHerosName(HeroA, Index)
  
  HeroA\Name[Index]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< StringSort Ascendant operator <<<<<

Procedure StringSortAscendantHerosName(*HeroA.Heros)
  
  ShellSortGap.l = #HEROS_NAME_MAX - 1
  
  Repeat
    
    ShellSortGap >> 1
    
    Repeat
      
      ShellSortSwapped.b = #False
      
      For Index = 0 To (#HEROS_NAME_MAX - 1 - ShellSortGap)
        
        UpperString00.s = UCase(GetHerosName(*HeroA, Index))
        UpperString01.s = UCase(GetHerosName(*HeroA, Index + ShellSortGap))
        CharIndex.l = 1
        
        While Mid(UpperString00, CharIndex ,1) = Mid(UpperString01, CharIndex , 1) And Len(UpperString00) >= CharIndex
          CharIndex + 1
        Wend
        
        If Mid(UpperString00, CharIndex ,1) > Mid(UpperString01, CharIndex ,1)
          Swap GetHerosName(*HeroA, Index), GetHerosName(*HeroA, Index + ShellSortGap)
          ShellSortSwapped = #True
        EndIf
        
      Next
      
    Until ShellSortSwapped = #False
    
  Until ShellSortGap = 1
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< StringSort Descendant operator <<<<<

Procedure StringSortDescendantHerosName(*HeroA.Heros)
  
  ShellSortGap.l = #HEROS_NAME_MAX - 1
  
  Repeat
    
    ShellSortGap >> 1
    
    Repeat
      
      ShellSortSwapped.b = #False
      
      For Index = 0 To (#HEROS_NAME_MAX - 1 - ShellSortGap)
        
        UpperString00.s = UCase(GetHerosName(*HeroA, Index))
        UpperString01.s = UCase(GetHerosName(*HeroA, Index + ShellSortGap))
        CharIndex.l = 1
        
        While Mid(UpperString00, CharIndex ,1) = Mid(UpperString01, CharIndex , 1) And Len(UpperString00) >= CharIndex
          CharIndex + 1
        Wend
        
        If Mid(UpperString00, CharIndex ,1) < Mid(UpperString01, CharIndex ,1)
          Swap GetHerosName(*HeroA, Index), GetHerosName(*HeroA, Index + ShellSortGap)
          ShellSortSwapped = #True
        EndIf
        
      Next
      
    Until ShellSortSwapped = #False
    
  Until ShellSortGap = 1
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Copy operator : A = Source : B = Destination <<<<<

Macro CopyHeros(HeroA, HeroB)
  
  For Index = 0 To #HEROS_NAME_MAX - 1
    SetHerosName(HeroB, Index, GetHerosName(HeroA, Index))
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Debugging macro <<<<<

Macro DebugHeros(HeroA)
  
  For Index = 0 To #HEROS_NAME_MAX - 1
    Debug GetHerosName(HeroA, Index)
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.032 seconds <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We fill Myheros structure with names. <<<<<

MyHeros.Heros

SetHerosName(MyHeros, 00, "Zoro")
SetHerosName(MyHeros, 01, "SuperMan")
SetHerosName(MyHeros, 02, "SpiderMan")
SetHerosName(MyHeros, 03, "Freak")
SetHerosName(MyHeros, 04, "Morpheus")
SetHerosName(MyHeros, 05, "Fred")
SetHerosName(MyHeros, 06, "Athena")
SetHerosName(MyHeros, 07, "Zeus")
SetHerosName(MyHeros, 08, "Hercule")
SetHerosName(MyHeros, 09, "Achille")
SetHerosName(MyHeros, 10, "Luke")
SetHerosName(MyHeros, 11, "Anakin")
SetHerosName(MyHeros, 12, "Mace Windu")
SetHerosName(MyHeros, 13, "Yoda")
SetHerosName(MyHeros, 14, "Obiwan")

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We copy MyHeros to test the sort commands on the same duty. <<<<<

CopyHeros(MyHeros, MyHerosCopy00.Heros)
CopyHeros(MyHeros, MyHerosCopy01.Heros)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We run the test <<<<<

Debug "MyHeros original list"
DebugHeros(MyHeros)
Debug ""

Debug "MyHeros Sorted Ascendant"
StringSortAscendantHerosName(MyHerosCopy00)
DebugHeros(MyHerosCopy00)
Debug ""

Debug "MyHeros Sorted Descendant"
StringSortDescendantHerosName(MyHerosCopy01)
DebugHeros(MyHerosCopy01)
Debug ""

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<  
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Guimauve a écrit :@Comtois : Merci pour l'exemple d'Arbre binaire sur ton site. Je m'en suis inspiré pour la comparaison des chaines de caractères.
Je m'étais cassé la tête pour rien parce qu'à l'époque je ne savais pas qu'on pouvait tester les chaînes entre elles directement avec PB.

Ce genre de tests fonctionne très bien
T1$ = T2$
T1$ > T2$
T1$ < T2$
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

C'est bizarre ça parce que j'avais fait quelque test et ça marchait pas vraiment. Du coup, j'ai pas cherché plus loin à comprendre et j'ai tout reprogrammé à partir de zéro. Je pense que j'avais oublié de faire un UCase() ou LCase() sur les chaînes et c'est ce qui causait l'erreur.

Je vais donc revoir la génération de mes algorythmes.

Merci à toi.

Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Évidamment, c'est le fun de savoir lire c'est écrit dans l'aide ...

Voiçi donc la version finale de l'exemple.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Size Array Constants <<<<<

#HEROS_NAME_MAX = 15

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration <<<<<

Structure Heros
  
  Name.s[#HEROS_NAME_MAX]
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The mutators <<<<<

Macro SetHerosName(HeroA, Index, Name_String)
  
  HeroA\Name[Index] = Name_String
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The observators <<<<<

Macro GetHerosName(HeroA, Index)
  
  HeroA\Name[Index]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< StringSort Ascendant operator <<<<<

Procedure StringSortAscendantHerosName(*HeroA.Heros)
  
  ShellSortGap.l = #HEROS_NAME_MAX - 1
  
  Repeat
    
    ShellSortGap >> 1
    
    Repeat
      
      ShellSortSwapped.b = #False
      
      For Index = 0 To (#HEROS_NAME_MAX - 1 - ShellSortGap)
        
        If UCase(GetHerosName(*HeroA, Index)) > UCase(GetHerosName(*HeroA, Index + ShellSortGap))
          Swap GetHerosName(*HeroA, Index), GetHerosName(*HeroA, Index + ShellSortGap)
          ShellSortSwapped = #True
        EndIf
        
      Next
      
    Until ShellSortSwapped = #False
    
  Until ShellSortGap = 1
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< StringSort Descendant operator <<<<<

Procedure StringSortDescendantHerosName(*HeroA.Heros)
  
  ShellSortGap.l = #HEROS_NAME_MAX - 1
  
  Repeat
    
    ShellSortGap >> 1
    
    Repeat
      
      ShellSortSwapped.b = #False
      
      For Index = 0 To (#HEROS_NAME_MAX - 1 - ShellSortGap)
        
        If UCase(GetHerosName(*HeroA, Index)) < UCase(GetHerosName(*HeroA, Index + ShellSortGap))
          Swap GetHerosName(*HeroA, Index), GetHerosName(*HeroA, Index + ShellSortGap)
          ShellSortSwapped = #True
        EndIf
        
      Next
      
    Until ShellSortSwapped = #False
    
  Until ShellSortGap = 1
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Copy operator : A = Source : B = Destination <<<<<

Macro CopyHeros(HeroA, HeroB)
  
  For Index = 0 To #HEROS_NAME_MAX - 1
    SetHerosName(HeroB, Index, GetHerosName(HeroA, Index))
  Next

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Debugging macro <<<<<

Macro DebugHeros(HeroA)
  
  For Index = 0 To #HEROS_NAME_MAX - 1
    Debug GetHerosName(HeroA, Index)
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 00.047 seconds <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We fill Myheros structure with names. <<<<<

MyHeros.Heros

SetHerosName(MyHeros, 00, "Zoro")
SetHerosName(MyHeros, 01, "SuperMan")
SetHerosName(MyHeros, 02, "SpiderMan")
SetHerosName(MyHeros, 03, "Freak")
SetHerosName(MyHeros, 04, "Morpheus")
SetHerosName(MyHeros, 05, "Fred")
SetHerosName(MyHeros, 06, "Athena")
SetHerosName(MyHeros, 07, "Zeus")
SetHerosName(MyHeros, 08, "Hercule")
SetHerosName(MyHeros, 09, "Achille")
SetHerosName(MyHeros, 10, "Luke")
SetHerosName(MyHeros, 11, "Anakin")
SetHerosName(MyHeros, 12, "Mace Windu")
SetHerosName(MyHeros, 13, "Yoda")
SetHerosName(MyHeros, 14, "Obiwan")

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We copy MyHeros to test the sort commands on the same duty. <<<<<

CopyHeros(MyHeros, MyHerosCopy00.Heros)
CopyHeros(MyHeros, MyHerosCopy01.Heros)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< We run the test <<<<<

Debug "MyHeros original list"
DebugHeros(MyHeros)
Debug ""

Debug "MyHeros Sorted Ascendant"
StringSortAscendantHerosName(MyHerosCopy00)
DebugHeros(MyHerosCopy00)
Debug ""

Debug "MyHeros Sorted Descendant"
StringSortDescendantHerosName(MyHerosCopy01)
DebugHeros(MyHerosCopy01)
Debug ""

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<  
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Trier en place un tableau statique imbriqué (Structure)

Message par comtois »

Guimauve a écrit :Les algorythmes de trie ne sont pas très rapide (Bubble Sort).
Perso je préfère le tri rapide, qui est très ... rapide :)

Et tu sais qu'il existe des fonctions de tris des tableaux dans PureBasic ?

Enfin c'est peut-être pour t'exercer au tri que tu fais ça ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Il y a plusieurs type d'algorythme de trie, ceux qui sont en place, c'est à dire ceux qui n'ont pas besoin d'un 2e tableau pour trier. Et ceux qui en on besoin d'au moins un 2e tableau pour travailler et c'est le cas de l'algorythme qui est utilisé par PB.

Mais la vraie question est :

Est-ce qu'il y a un moyen pour passer un tableau statique imbriqué en paramètre aux commandes de tri standard ?

Parce que moi j'ai pas réussi à trouver le moyen de le faire. Le seul moyen que j'utilisais jusqu'a tout récemment c'était de copier le tableau statique imbriqué dans un dynamique trier le dynamique et recopier le tableau dynamique dans le statique imbriqué.

Donc pour trier un tableau static en le copiant dans un dynamique et le triant avec un algorythme qui utilise un 2e tableau pour travailler, on a donc 3 tampons mémoires nécessaires pour trier un simple tableau statique imbriqué dans une structure.

Il me semble que ce n'est pas très efficace comme méthode. C'est pour cette raison que je fais moi-même les algorythmes de trie strictement adaptés aux tableaux statiques imbriqués dans des structures de données.

Voilà.

A+
Guimauve
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok je n'avais pas compris :?

alors voici un exemple avec le tri rapide

Code : Tout sélectionner

#HEROS_NAME_MAX = 15 

Structure Heros
 
  Name.s[#HEROS_NAME_MAX+1]
 
EndStructure 

Macro SetHerosName(HeroA, Index, Name_String)
 
  HeroA\Name[Index] = Name_String
 
EndMacro 

Macro DebugHeros(HeroA)
 
  For Index = 0 To #HEROS_NAME_MAX - 1
    Debug HeroA\Name[Index]
  Next
 
EndMacro 

MyHeros.Heros

SetHerosName(MyHeros, 00, "Zoro")
SetHerosName(MyHeros, 01, "SuperMan")
SetHerosName(MyHeros, 02, "SpiderMan")
SetHerosName(MyHeros, 03, "Freak")
SetHerosName(MyHeros, 04, "Morpheus")
SetHerosName(MyHeros, 05, "Fred")
SetHerosName(MyHeros, 06, "Athena")
SetHerosName(MyHeros, 07, "Zeus")
SetHerosName(MyHeros, 08, "Hercule")
SetHerosName(MyHeros, 09, "Achille")
SetHerosName(MyHeros, 10, "Luke")
SetHerosName(MyHeros, 11, "Anakin")
SetHerosName(MyHeros, 12, "Mace Windu")
SetHerosName(MyHeros, 13, "Yoda")
SetHerosName(MyHeros, 14, "Obiwan") 


Procedure tri_rapide(*HeroA.Heros, p, d)
vmin=p
vmax=d
separateur.s=*HeroA\Name[(p+d)/2]
Repeat
   While *HeroA\Name[vmin]<separateur : vmin + 1 : Wend
   While *HeroA\Name[vmax]>separateur : vmax - 1 : Wend
   If vmin<=vmax
      temp.s=*HeroA\Name[vmin]
      *HeroA\Name[vmin]=*HeroA\Name[vmax]
      *HeroA\Name[vmax]=temp
      vmin + 1
      vmax - 1
   EndIf
Until vmin>vmax
If p<vmax : tri_rapide(*HeroA, p, vmax) : EndIf
If vmin<d : tri_rapide(*HeroA, vmin, d) : EndIf
EndProcedure


Debug "MyHeros original list"
  DebugHeros(MyHeros)
Debug ""

Debug "MyHeros Sorted Ascendant"
tri_rapide(@MyHeros, 0, #HEROS_NAME_MAX-1)
DebugHeros(MyHeros)
Debug "" 
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Y a pas de problème. C'est juste que dans certain cas la quantité de mémoire utilisé est critique. Dans le cas d'un jeu par exemple, il y a souvent beaucoup de données chargées en mémoire et donc un algorythme prend moins de place mémoire que 2 à 3 copies d'un même tableau.

Quoiqu'il en soit je vais comparé pourquoi que moi j'ai un invalid memory access dans mon QuickSort alors que le tiens fonctionne

A+
Guimauve
Répondre