VBA de la matrice de la fonction de tri?
Je suis à la recherche pour un bon tri de mise en œuvre pour les tableaux en VBA. Un Quicksort serait préférable. Ou de toute autre algorithme de tri autres que la bulle ou la fusion devrait suffire.
Veuillez noter que ceci est de travailler avec MS Project 2003, ce qui devrait éviter toute Excel fonctions natives et n'importe quoi .net liée.
- Cela fonctionne avec vb6 ainsi.
- Peut-être intéressant de prendre un coup d'oeil ici: rosettacode.org/wiki/Sorting_algorithms/Quicksort#VBA
- Pourquoi n'avez-vous pas envie de fusion de tri?
Vous devez vous connecter pour publier un commentaire.
jetez un oeil ici:Edit: référencé dans La source (allexperts.com) a depuis fermé, mais voici les auteur commentaires:
Notez que cela fonctionne uniquement avec unique dimensions (aka "normal"?) les tableaux de. (Il y a un travail un tableau multi-dimensionnel QuickSort ici.)
While (tmpLow <= tmpHi)
,While (vArray(tmpLow) < pivot And tmpLow < inHi)
,If (tmpLow <= tmpHi) Then
etIf (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
\ 2
simplement une division par 2? Si non, que faut-il faire?J'ai converti le rapide de rapide de tri de l'algorithme de VBA, si quelqu'un d'autre veut.
Je l'ai optimisé pour fonctionner sur un tableau de Int/Longs, mais il doit être simple pour convertir un qui travaille sur l'arbitraire des éléments comparables.
Explication en allemand, mais le code est testé en place de mise en œuvre:
Invoquée comme ceci:
ByVal
arrivés là-dedans. La confusion vient probablement du fait que dans le VB.NETByVal
pourrait fonctionner ici (si cela doit être mis en œuvre différemment dans VB.NET de toute façon).Nombre Naturel (Chaînes De Caractères) Tri Rapide
Juste pour la pile sur le sujet.
Normalement, si vous trier les chaînes avec les chiffres, vous obtiendrez quelque chose comme ceci:
Mais vous voulez vraiment qu'il puisse reconnaître les valeurs numériques et être classés comme
Voici comment le faire...
Remarque:
Nombre Naturel Tri Rapide
Nombre naturel de Comparer(Utilisé dans la fonction de Tri Rapide)
appel isdigit(Utilisé dans CompareNaturalNum)
J'ai posté un peu de code en réponse à une question sur StackOverflow:
Tri d'une multidimensionnal tableau en VBA
Les exemples de code dans ce thread comprennent:
Alain optimisée de Quicksort est très brillant: j'ai juste fait une base de split-et-recurse, mais l'exemple de code ci-dessus a un "déclenchement" fonction qui coupe vers le bas sur redondante des comparaisons de valeurs dupliquées. D'autre part, j'ai le code pour Excel, et il y a un peu plus dans le sens de la défense de codage - être averti, vous en aurez besoin si votre tableau contient le pernicieuse " Empty()' variante, qui va briser votre While... Wend opérateurs de comparaison et de piéger votre code dans une boucle infinie.
Noter que quicksort algorthms - et tout algorithme récursif - peut remplir la pile et de crash Excel. Si votre tableau comporte moins de 1024 membres, j'aimerais utiliser un rudimentaire BubbleSort.
System.Collections.ArrayList
est situé dans différents endroits de 32 bits et 64 bits de Windows. Mon 32bit Excel implicitement essaie de le trouver dans un endroit où 32bit Gagner le stocker, mais depuis que j'ai Win 64bit, j'ai aussi un problème :/ j'ai une erreur-2146232576 (80131700)
.Vous ne voulez pas une solution basée sur Excel mais depuis que j'ai eu le même problème aujourd'hui et je voulais le tester à l'aide d'autres Applications Office les fonctions que j'ai écrit la fonction ci-dessous.
Limitations:
Testé appelant Excel 2010, à partir de Visio 2010
C'est un exemple sur la façon de tester la fonction:
Si quelqu'un teste cette utilisation d'autres versions d'office s'il vous plaît poster ici si il y a des problèmes.
msgbox_array()
est une fonction utile pour inspecter tout tableau en 2 dimensions rapidement pendant le débogage.Je me demande ce que voudriez-vous dire à propos de ce tableau de tri code. C'est rapide pour la mise en œuvre et de l'emploi ... ne l'ai pas testé pour les tableaux grand encore. Il travaille pour des tableaux unidimensionnels, pour multidimensionnelle des valeurs supplémentaires de la re-localisation de la matrice serait nécessaire de construire (avec une dimension moins que le premier tableau).
Je pense que mon code (à l'essai) est plus "éduqués", en supposant le plus simple sera le mieux.
Double
au lieu deLong
partout. Deuxièmement, il ne prend pas en compte si la gamme a de multiples domaines. Le tri d'un rectangle ne semble pas utile et bien sûr, il n'est pas ce que l'OP a demandé (plus précisément dit non native d'Excel/.Net solutions). Aussi, si vous assimiler le plus simple sera le mieux est plus "éduqués", puis ne pas utiliser le construit enRange.Sort()
fonction d'être le meilleur?C'est ce que j'utilise pour trier dans la mémoire - il peut facilement être étendu pour trier un tableau.
Heapsort mise en œuvre. Un O(n log(n)) (en moyenne et au pire des cas), à la place, instable algorithme de tri.
Utiliser avec:
Call HeapSort(A)
, oùA
est un tableau unidimensionnel de variantes, avecOption Base 1
.@Prasand Kumar, voici un complet de la routine de tri basé sur Prasand concepts: