begin process at 2012 05 27 20:23:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > LIBRAIRIE CONTENANT UNE TRENTAINE D'ALGORITHMES DE TRI

LIBRAIRIE CONTENANT UNE TRENTAINE D'ALGORITHMES DE TRI


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :tri, algorithme, chrono Niveau :Initié Date de création :14/01/2007 Date de mise à jour :14/01/2007 21:27:30 Vu / téléchargé :7 294 / 908

Auteur : xkamen

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Je poste ici une librairie contenant un grand nombre d'algorithmes de tri, dont les plus connus et les plus utilisés (comme le tir à bulles, le tri par sélection, le tri par insertion, le tri rapide, ...) qui ont déjà été déposé sur ce site. Je viens juste compléter toutes les librairies précédentes en ajoutant un grand nombre d'algorithmes de tri qui sont parfois des variantes améliorées des tris usuels. De plus, la librairie a été réalisée à l'aide de template afin de ne pas limiter les tris à certaines données.

Pourquoi ces différents tris ? Nombreuses sont les personnes qui souhaitent trié une liste ou un vecteur, et selon leur utilisation, certains tris peuvent être plus judicieux qu'un autre. Il n'en existe pas un qui soit meilleur que les autres, mais suivant le nombre de valeurs à trier, la distribution de ces valeurs, le nombre de valeurs différentes utilisées, le fait que ces valeurs puissent être déjà presque triées ou non, il conviendra de choisir un algorithme de tri précis. C'est pourquoi j'ai implémenté toutes ces méthodes, pour que chacun puisse les essayer.

Un fichier PDF accompagne la source afin d'expliquer en détail les différentes méthodes de tri.

Source

  • #include <cstdio>
  • #include <ctime>
  • #include "tri.h"
  • #include "chrono.h"
  • #define NODISP
  • #define MAXVALUE_1 256
  • #define MAXVALUE_2 2
  • #define MAXSIZE_1 4096
  • #define MAXSIZE_2 10
  • #define MAXSIZE_3 25
  • typedef int data; // A modifier pour essayer d'autres types de valeur
  • std::vector<data> vector, vectorTrie;
  • int size;
  • int maxvalue;
  • Chrono chrono;
  • /*********************************************************************************************/
  • inline int compareFunc(const void* elem1, const void* elem2)
  • {
  • if (*(data*)elem1 > *(data*)elem2) return 1;
  • else if (*(data*)elem1 < *(data*)elem2) return -1;
  • else return 0;
  • }
  • inline unsigned int keyFunc (const void *elem)
  • {
  • return unsigned int(*(data*)elem);
  • }
  • /*********************************************************************************************/
  • void ComparisonSort(char method)
  • {
  • // Nom du tri en cour
  • printf("> %s : ",NameOfSort(method).c_str());
  • // Préparation au tri
  • vectorTrie = vector;
  • chrono.Start();
  • // Tri
  • Sort<data>(method,vectorTrie,size,compareFunc);
  • // Récupération et affichage du temps écoulé
  • float Time = chrono.GetDiff_ms();
  • printf("%f ms > ",Time);
  • // Vérification si le tri a été bien effectué
  • if (VerifySort<data>(vectorTrie,size,compareFunc)) printf("OK\n");
  • else printf("FAILED\n");
  • }
  • void KeySort(char method)
  • {
  • // Nom du tri en cour
  • printf("> %s : ",NameOfSort(method).c_str());
  • // Préparation au tri
  • vectorTrie = vector;
  • chrono.Start();
  • // Tri
  • Sort<data,unsigned int>(method,vectorTrie,size,maxvalue,keyFunc);
  • // Récupération et affichage du temps écoulé
  • float Time = chrono.GetDiff_ms();
  • printf("%f ms > ",Time);
  • // Vérification si le tri a été bien effectué
  • if (VerifySort<data>(vectorTrie,size,compareFunc)) printf("OK\n");
  • else printf("FAILED\n");
  • }
  • void VerificationTime()
  • {
  • // Démarrage du chrono
  • chrono.Start();
  • // Vérification des données triées
  • VerifySort<data>(vectorTrie,size,compareFunc);
  • // Récupération du temps écoulé
  • float Time = chrono.GetDiff_ms();
  • // Affichage du temps écoulé
  • printf("> Etape de verification : %f ms\n",Time);
  • }
  • /*********************************************************************************************/
  • void Test_with_RandomSort_and_SlowSort()
  • {
  • for (char method=NORMAL_SORT; method<=SHEAR_SORT; method++)
  • ComparisonSort(method);
  • for (; method<=FLASH_SORT; method++)
  • KeySort(method);
  • }
  • void Test_without_RandomSort_neither_SlowSort()
  • {
  • for (char method=NORMAL_SORT; method<=SHEAR_SORT; method++)
  • if (method<BOGO_SORT || (method>QUANTUM_BOGO_SORT && method!=STOOGE_SORT && method!=PERMUTATION_SORT))
  • ComparisonSort(method);
  • for (; method<=FLASH_SORT; method++)
  • KeySort(method);
  • }
  • void InitSort(int n, int s, int m)
  • {
  • // Message d'initialisation
  • size = s; maxvalue = m;
  • printf("Test %d : cas d'un vecteur de %d valeurs comprises entre 0 et %d\n",n,size,maxvalue-1);
  • // Choix de la taille du vecteur
  • vector.resize(size);
  • // Remplissage du vecteur
  • for (int i=0; i<size; i++) vector[i] = data(rand()%m);
  • }
  • /*********************************************************************************************/
  • main()
  • {
  • // Message de bienvenue
  • printf("Bienvenue dans le test des algorithmes de tri d'un vecteur\n\n");
  • // Initialisation du générateur pseudo aléatoire
  • srand ( (unsigned int)time(NULL) );
  • /**************************************************************************************************/
  • InitSort(1,MAXSIZE_2,MAXVALUE_1);
  • Test_with_RandomSort_and_SlowSort();
  • printf("\n");
  • /**************************************************************************************************/
  • InitSort(2,MAXSIZE_3,MAXVALUE_2);
  • Test_with_RandomSort_and_SlowSort();
  • printf("\n");
  • /**************************************************************************************************/
  • InitSort(3,MAXSIZE_1,MAXVALUE_1);
  • Test_without_RandomSort_neither_SlowSort();
  • printf("\n");
  • /**************************************************************************************************/
  • InitSort(4,MAXSIZE_1,MAXVALUE_2);
  • Test_without_RandomSort_neither_SlowSort();
  • printf("\n");
  • /**************************************************************************************************/
  • VerificationTime();
  • printf("\n");
  • }
#include <cstdio>
#include <ctime>
#include "tri.h"
#include "chrono.h"


#define NODISP

#define MAXVALUE_1				256
#define MAXVALUE_2				2

#define MAXSIZE_1				4096
#define MAXSIZE_2				10
#define MAXSIZE_3				25

typedef int data;		// A modifier pour essayer d'autres types de valeur
std::vector<data> vector, vectorTrie;

int size;
int maxvalue;
Chrono	chrono;

/*********************************************************************************************/
inline int compareFunc(const void* elem1, const void* elem2)
{
	if (*(data*)elem1 > *(data*)elem2)		return 1;
	else if (*(data*)elem1 < *(data*)elem2)	return -1;
	else									return 0;
}

inline unsigned int keyFunc (const void *elem)
{
	return unsigned int(*(data*)elem);
}

/*********************************************************************************************/
void ComparisonSort(char method)
{
	// Nom du tri en cour
	printf("> %s :  ",NameOfSort(method).c_str());

	// Préparation au tri
	vectorTrie = vector;
	chrono.Start();

	// Tri
	Sort<data>(method,vectorTrie,size,compareFunc);

	// Récupération et affichage du temps écoulé
	float Time = chrono.GetDiff_ms();
	printf("%f ms > ",Time);

	// Vérification si le tri a été bien effectué
	if (VerifySort<data>(vectorTrie,size,compareFunc))	printf("OK\n");
	else												printf("FAILED\n");
}

void KeySort(char method)
{
	// Nom du tri en cour
	printf("> %s :  ",NameOfSort(method).c_str());

	// Préparation au tri
	vectorTrie = vector;
	chrono.Start();

	// Tri
	Sort<data,unsigned int>(method,vectorTrie,size,maxvalue,keyFunc);

	// Récupération et affichage du temps écoulé
	float Time = chrono.GetDiff_ms();
	printf("%f ms > ",Time);

	// Vérification si le tri a été bien effectué
	if (VerifySort<data>(vectorTrie,size,compareFunc))	printf("OK\n");
	else												printf("FAILED\n");
}

void VerificationTime()
{
	// Démarrage du chrono
	chrono.Start();

	// Vérification des données triées
	VerifySort<data>(vectorTrie,size,compareFunc);

	// Récupération du temps écoulé
	float Time = chrono.GetDiff_ms();

	// Affichage du temps écoulé
	printf("> Etape de verification :  %f ms\n",Time);
}

/*********************************************************************************************/
void Test_with_RandomSort_and_SlowSort()
{
	for (char method=NORMAL_SORT; method<=SHEAR_SORT; method++)
		ComparisonSort(method);

	for (; method<=FLASH_SORT; method++)
		KeySort(method);
}

void Test_without_RandomSort_neither_SlowSort()
{
	for (char method=NORMAL_SORT; method<=SHEAR_SORT; method++)
		if (method<BOGO_SORT || (method>QUANTUM_BOGO_SORT && method!=STOOGE_SORT && method!=PERMUTATION_SORT))
			ComparisonSort(method);

	for (; method<=FLASH_SORT; method++)
		KeySort(method);
}

void InitSort(int n, int s, int m)
{
	// Message d'initialisation
	size = s;	maxvalue = m;
	printf("Test %d : cas d'un vecteur de %d valeurs comprises entre 0 et %d\n",n,size,maxvalue-1);

	// Choix de la taille du vecteur
	vector.resize(size);

	// Remplissage du vecteur
	for (int i=0; i<size; i++)	vector[i] = data(rand()%m);
}

/*********************************************************************************************/
main()
{
	// Message de bienvenue
	printf("Bienvenue dans le test des algorithmes de tri d'un vecteur\n\n");

	// Initialisation du générateur pseudo aléatoire
	srand ( (unsigned int)time(NULL) );

	/**************************************************************************************************/
	InitSort(1,MAXSIZE_2,MAXVALUE_1);
	Test_with_RandomSort_and_SlowSort();
	printf("\n");

	/**************************************************************************************************/
	InitSort(2,MAXSIZE_3,MAXVALUE_2);
	Test_with_RandomSort_and_SlowSort();
	printf("\n");

	/**************************************************************************************************/
	InitSort(3,MAXSIZE_1,MAXVALUE_1);
	Test_without_RandomSort_neither_SlowSort();
	printf("\n");

	/**************************************************************************************************/
	InitSort(4,MAXSIZE_1,MAXVALUE_2);
	Test_without_RandomSort_neither_SlowSort();
	printf("\n");

	/**************************************************************************************************/
	VerificationTime();
	printf("\n");
}

 Conclusion

Dans la source, il me reste encore 2 tris à implémenter : le 'SpreadSort' et le 'LibrarySort'. Si quelqu'un a des suggestions à faire pour améliorer les méthodes implémentées dans cette source, ou même des idées pour en rajouter d'autres, n'hésitez pas, je complèterais la source.

Le tri d'une liste chainée ou d'une map n'a pas été implémenté. Seul les tableaux et les vecteurs sont utilisés.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Sort
    • Chrono.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 294 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 427 octets
    • Méthodes de tri.pdfTélécharger ce fichier [Réservé aux membres club]296 652 octets
    • Sort.ex_Télécharger ce fichier [Réservé aux membres club]77 824 octets
    • Sort.vcprojTélécharger ce fichier [Réservé aux membres club]3 472 octets
    • Tri.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier59 313 octets

Télécharger le zip


 Historique

14 janvier 2007 21:27:31 :
Mise à jour du fichier PDF à propos de l'algorithme CombSort

 Sources du même auteur

TABLEAU 3D GÉNÉRIQUE

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture RÉSOLUTION SUDOKU (9X9) PAR BACKTRACKING RÉCURSIF INTELLIGEN... par Gallien69
GÉRER UN COMBAT DANS UN JEU 2D / ALGORITHME PRIMAIRE D'UNE I... par Chiheb2010
Source avec Zip Source avec une capture ALGORITHME DE TRI D'UN TABLEAU PAR ORDRE CROISSANT OU DÉCROI... par Thuzhen
Source avec Zip COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF par xtremejames183

Commentaires et avis

Commentaire de The_Void le 14/01/2007 18:59:53

Salut,
J'ai jeté un coup d'oeil à ton pdf, et il a l'air d'être très complet :)
Par contre, pour l'algo de tri Comb, j'ai remarqué qu'il n'y a pas de "permut = false" dans la boucle (il est juste avant) , d'où une boucle infini ;)

Commentaire de xkamen le 14/01/2007 21:28:48

Salut,
Je te remercie, je viens de corriger l'erreur dans le PDF. Heureusement, je n'avais pas fait l'erreur dans la source elle-même. :)

Commentaire de Patrice99 le 15/01/2007 16:12:15

Salut, si ça peut t'intéresser, j'ai trouvé un comparateur universel en DotNet2 capable de trier sur plusieurs clés (mais pas toujours très performant, ce qui est dommage) :
www.dotnet2themax.com/ShowContent.aspx?ID=05c3d0c3-ac44-4a20-92d9-16cdae040bc3
UniversalComparer comp = new UniversalComparer(typeof(Person), "LastName, FirstName");
Array.Sort(persons, comp)

Commentaire de xkamen le 15/01/2007 19:22:51

Merci, je vais regarder ça et je complèterai. C'est normal que ce ne soit pas toujours performant. Selon les situations, un algorithme de tri peut etre plus performant qu'un autre. Donc je ne m'inquiète pas. Si un utilisateur désire utiliser un de ces algorithmes, il devra tout d'abord regarder si ce qu'il désire trier est dans une situation particulière ou non, c'est à dire soit partiellement trié, soit disposant d'un faible nombre de valeurs, etc...
S'il existait un algorithme qui soit toujours performant quelque soit le type de données, alors je ne vois pas pourquoi on garderait les autres algorithmes. :D

Commentaire de Patrice99 le 16/01/2007 08:37:59

Tout à fait exact ! Cependant, dans l'hypothèse où tu ne gardes qu'un seul algorithme dans le cas le plus général qui soit (ce que feront sans doute 95% des développeurs), alors si tu n'as pas besoin de trier sur 2 clés comme dans une requête SQL et que la performance compte, mieux vaut ne pas utiliser le comparateur universel. Dans les autres cas, c'est une classe passe partout super pratique.

Commentaire de xkamen le 16/01/2007 08:51:12

Ceci n'implique t-il pas de programmer en C# ? Car ici, le code est en C++. De plus, si j'ai bien compris, les données sont représentées sous la forme d'un tableau : dans ce cas, je comprends que ce soit très pratique. Mais que se passe t-il si les données à trier sont de la forme :

class Data
{
   int Quantite;
   SubData *Value;
};

class SubData
{
   float Value;
   ...  // Avec encore des pointeurs vers d'autres données
};

Ici, j'ai pris un exemple que montre des données qui pointent vers d'autres données en chaine. Est ce qu'il sera pratique d'utiliser le comparateur universel dans ce cas ? Si je demande cela, c'est que je ne connais pas trop le C# ni le comparateur universel, donc je voulais savoir si ce comparateur universel pouvait s'appliquer dans n'importe quel cas, même si les performances peuvent décroitre dans certains cas.

Commentaire de xkamen le 16/01/2007 10:45:52

En fait, je viens de regarder ce que c'était le IComparer. Ce comparateur universel est un comparateur seulement qui permet facilement d'écrire comment est effectué le tri en spécifiant les clefs (avec l'ordre ascendant ou descendant). Mais la méthode de tri reste celle du compilateur. Est ce que cette méthode tri est vraiment la plus efficace ? là, je ne sais pas, il faudrait la comparer aux méthodes inclues dans ma source.

Par contre, ce que je pourrais rajouter, c'est le fait d'utiliser un comparateur universel plutot que les comparateurs définis par 'int (*comp)(void *elem1, void *elem2)', ce qui permettrait de rendre le tout plus facilement utilisable. En gros, il faut que j'améliore mon comparateur pour le rendre universel. :D

Commentaire de Patrice99 le 16/01/2007 11:19:59

Oui il sert surtout à faciliter l'écriture de code DotNet2, et je crois bien que c'est la seule solution pour le tri à clés multiples en RAM. Pour les pointeurs, je n'en sais rien du tout, ça fait des années que j'ai définitivement oublié ces trucs pour se torturer (probablement) inutilement les méninges.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Complexité de l'algorithme de Tri Fusion [ par ousin ] Salut tout le monde, je voudrais de l'aide pour demontrer mathematiquement en urilisant la resolution des reccurences que la complexité du Tri Fusion Questions urgentes en Algorithme et Complexité [ par nostalgieing ] bonjour j'ai une ambiguté en algorithme et complexité et j'ai quelques questions à poser et j'ai besoin de vos aide c'est urgent 1-quelle est la met algorithme de tri hoare [ par alinformatik ] au cours des travaux pratiques en module de système d'exploitation, pour comprendre la synchronisation des processus sous linux on nous a demandé d'éc algorithme de tri par base en c [ par houda986 ] salut; j'ai cherche d'algorithme en c et aucun idée pour faire ou démarrer en plus je suis débutante en c j'ai pas compris comment utiliser fonction besoin d'aide dans programme en c [ par houda986 ] salut; je suis un débutante en programmation et j'ai besoin d'aide pour la résolution d'un programme en C,c'est un programme de tri par base ... j'ai algorithme tarjan [ par hassan116 ] Bonjour, je viens faire appel à votre aide pour un problème sur un algorithme Tarjan de détection de composantes fortement connexes dans un graphe algorithme RC5 [ par rahoub ] salut à tous, svp je besoin d'un code source de l'algorithme de cryptographie RC5 développer sous matlab .J'attends vos aides et merci en avance :) je [BAR]Recherche algorithme de reconnaissance de style [ par Lucky92 ] Bonsoir tout le monde, J'aimerais savoir si quelqu'un connaît une application ou un algorihtme qui prendrait en entrée deux textes, et qui permettrai algorithme zéro d'une fonction [ par louna12 ] Bonsoir, pouvez-vous m'aider sur ce qui suit, svp? Écrire un algorithme qui calcule le zéro d&#8217;une fonction f(x) sur l&#8217;intervalle [a; b], Décomposition LU [ par sdrh ] Bonjour à tous, et merci d'avance à tout ceux qui m'apporteront des réponses. Je cherche un algorithme de décomposition LU d'une Matrice en CPP, et m


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales