begin process at 2012 05 27 14:41:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF

COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :tri, algorithme, quicksort, comb sort Niveau :Débutant Date de création :13/12/2008 Date de mise à jour :15/12/2008 15:31:42 Vu / téléchargé :4 297 / 75

Auteur : xtremejames183

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

 Description

C'est un algorithme de tri simple a coder non récursif et "peut" rivaliser avec les algo complexe a la quicksort.
il est dérive du fameux algorithme merdique le  bubblesort (Tri a Bulles),l'idée de base est de élargir le pas 'gap' au lieu de comparer les éléments un a un ( i et i+1 ) , on utilise un shrink factor(1.3) pour calculer le pas jusqu'à ce qu'il soit réduit a 1 et en retourne en mode bubblesort.
voici le résultat obtenu en comparant les algos de tri sur une liste de 10000 nombre aléatore ( d'apres BYTE MAGAZINE)

Algo       Vitesse (secondes)
=============================
QSort      0.0038
CombSort   0.0042
BubbleSort 1.36

voila le commentaire d'origine en Anglais:

' Comb Sort an array of any type
'
' CombSort is faster than all but QuickSort and close to it.
' On the other hand, the code is much simpler than QuickSort
' and can be easily customized for any array type
' This definition is based on an article appeared on the Byte
' magazine in about 1985.

Source

  • /**
  • * Voila le commentaire d'origine en Anglais:
  • ' Comb Sort an array of any type
  • '
  • ' CombSort is faster than all but QuickSort and close to it.
  • ' On the other hand, the code is much simpler than QuickSort
  • ' and can be easily customized for any array type
  • ' This definition is based on an article appeared on the Byte
  • ' magazine in about 1985.
  • */
  • /*
  • * Comme c'est écrit c'est un algorithme de tri assez rapide simple a implémenter non-récursif et ne requiert aucune
  • * donné externe (pile,file) pour stocker les indices. il est d'ailleurs utilisé dans le serveur Lighttpd ( mod_dir,... )
  • * L'idée de base est d'elargir le pas (gap) en utilisant le shrink factor qui est de formule
  • * GAP = GAP * 1.3
  • * d'apres les auteurs de l'algorithme un pas de 9 et 10 sont consideres comme mauvais c'est pour cela qu'on
  • * utlise un SF de 11
  • * REFERENCE:
  • * http://www.nist.gov/dads/HTML/combSort.html
  • * http://www.tscc.de/combsort.html
  • * et les WIKIPEDIA of course
  • */
  • /*
  • * $SymiscID: combsort.c 0.0125 15/12/2008 15:19 Win32 MSVC9.0 $
  • * @auteur Mrad Chems Eddine <xtremejames183@msn.com>
  • */
  • #include <stdio.h>
  • #include <stdlib.h>
  • #ifdef _WIN32
  • typedef unsigned int size_t;
  • #else
  • #include <sys/param.h>
  • #endif
  • typedef int (*ProcCmp)(const void *,const void *,size_t);
  • #define BYTE_SWAP(x,y,t)\
  • {\
  • register unsigned char *s = ( unsigned char *)x;\
  • register unsigned char *d = ( unsigned char *)y;\
  • size_t len = t;\
  • do{\
  • char t = *s ; *s++ = *d ; *d++ = t;\
  • }while(--len);}
  • void CombSort(int *t,size_t NBElem)
  • {
  • int gap;
  • for( gap = NBElem;;){
  • short SWAP ; /* flag pour voir si la liste est trie */
  • int i;
  • /* appliquer le shrink factor */
  • gap = gap * 10 / 13;
  • if( gap == 9 || gap == 10 ){
  • gap = 11;
  • }
  • if( gap < 1 ){
  • gap = 1; /* bubble sort */
  • }
  • for(i = 0 , SWAP = 0 ; i < ( NBElem - gap) ; ++i){
  • if( t[i] > t[i+gap] ){
  • /* swap */
  • int tmp = t[i];
  • t[i] = t[i+gap];
  • t[i+gap] = tmp;
  • SWAP = 1 ;
  • }
  • }
  • if( gap <= 1 && !SWAP ){
  • /* la liste est déjà trie */
  • break;
  • }
  • }
  • }
  • static int __CMP(const void *a,const void *b,size_t size)
  • {
  • int _a = *(int *)a;
  • int _b = *(int *)b;
  • return _a - _b;
  • }
  • void GenericCombSort(void *base,size_t NBElem,size_t ElemSize,ProcCmp pcmp)
  • {
  • char *start ;
  • int gap;
  • if( base == NULL || NBElem <= 1 || pcmp == NULL){
  • return;
  • }
  • for(start = (char *)base,gap = NBElem;;){
  • short SWAP;
  • size_t i;
  • gap = gap * 10 / 13;
  • if( gap == 9 || gap == 10 ){
  • gap = 11;
  • }
  • for( SWAP = 0 , i =0 ; i < ( NBElem - gap ) * ElemSize ; i+= ElemSize ){
  • int p = ( gap * ElemSize ) +i;
  • if( pcmp((start+i),(start+p),ElemSize) > 0 ){
  • BYTE_SWAP((start+i),(start+p),ElemSize);
  • SWAP = 1;
  • }
  • }
  • if( gap <= 1 && !SWAP ){
  • break;
  • }
  • }
  • }
  • int main()
  • {
  • int tab[] = { 56,1,784,-42,8,24,72,-98,153,13,255,27,-17,6,9421,-842,423,61,89,37,10,261,436,175,145 };
  • const size_t MAX = sizeof(tab)/sizeof(tab[0]);
  • size_t i;
  • /* a essayer sur tous;float,long,meme char */
  • for( i = 0 ; i < MAX ; ++i )
  • printf("%d ",tab[i]);
  • printf("\n");
  • /* t1 = clock() */
  • //CombSort(tab,MAX);
  • /*
  • * tab = Tableau a trier
  • * MAX = Nombre d'entre dans le tableau
  • * ElemSize = taille d'un seul element dans le tableau (sizeof(tab[0])
  • * __CMP = fonction de comapraison
  • */
  • GenericCombSort((void *)tab,MAX,sizeof(int),__CMP);
  • /* t2 = clock() */
  • puts("Tableau Trier");
  • for( i = 0 ; i < MAX ; ++i )
  • printf("%d ",tab[i]);
  • printf("\n");
  • #ifdef _WIN32
  • getch();
  • #endif
  • return 0;
  • }
/**
* Voila le commentaire d'origine en Anglais:
' Comb Sort an array of any type
'
' CombSort is faster than all but QuickSort and close to it.
' On the other hand, the code is much simpler than QuickSort
' and can be easily customized for any array type
' This definition is based on an article appeared on the Byte
' magazine in about 1985.
*/

/*
* Comme c'est écrit c'est un algorithme de tri assez rapide simple a implémenter non-récursif et ne requiert aucune
* donné externe (pile,file) pour stocker les indices. il est d'ailleurs utilisé dans le serveur Lighttpd ( mod_dir,... )
* L'idée de base est d'elargir le pas (gap) en utilisant le shrink factor qui est de formule
* GAP = GAP * 1.3
* d'apres les auteurs de l'algorithme un pas de 9 et 10 sont consideres comme mauvais c'est pour cela qu'on
* utlise un SF de 11
* REFERENCE:
* http://www.nist.gov/dads/HTML/combSort.html
* http://www.tscc.de/combsort.html
* et les WIKIPEDIA of course
*/

/*
* $SymiscID: combsort.c 0.0125 15/12/2008 15:19 Win32 MSVC9.0 $
* @auteur Mrad Chems Eddine <xtremejames183@msn.com>
*/

#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
typedef unsigned int size_t;
#else
#include <sys/param.h>
#endif

typedef int (*ProcCmp)(const void *,const void *,size_t);

#define BYTE_SWAP(x,y,t)\
 {\
register unsigned char *s = ( unsigned char *)x;\
 register unsigned char *d = ( unsigned char *)y;\
 size_t len = t;\
 do{\
 char t = *s ; *s++ = *d ; *d++ = t;\
 }while(--len);}


void CombSort(int *t,size_t NBElem)
{
 int gap;
 for( gap = NBElem;;){
 short SWAP ; /* flag pour voir si la liste est trie */
 int i;

 /* appliquer le shrink factor */
 gap = gap * 10 / 13;
 if( gap == 9 || gap == 10 ){
 gap = 11;
 }
 if( gap < 1 ){
 gap = 1; /* bubble sort */
 }
 for(i = 0 , SWAP = 0 ; i < ( NBElem - gap) ; ++i){
 if( t[i] > t[i+gap] ){
 /* swap */
 int tmp = t[i];
 t[i] = t[i+gap];
 t[i+gap] = tmp;
 SWAP = 1 ;
 }
 }
	if( gap <= 1 && !SWAP ){
			/* la liste est déjà trie */
		break;
	}

	}
}

static int __CMP(const void *a,const void *b,size_t size)
{
	int _a = *(int *)a;
	int _b = *(int *)b;

	return _a - _b;
}

void GenericCombSort(void *base,size_t NBElem,size_t ElemSize,ProcCmp pcmp)
{
	char *start ;
	int gap;

	if( base == NULL || NBElem <= 1 || pcmp == NULL){
		return;
	}

	for(start = (char *)base,gap = NBElem;;){
		short SWAP;
		size_t i;

		gap = gap * 10 / 13;
		if( gap == 9 || gap == 10 ){
			gap = 11;
		}
		for( SWAP = 0 , i =0 ; i < ( NBElem - gap ) * ElemSize ; i+= ElemSize ){
			int p = ( gap * ElemSize ) +i;
			if( pcmp((start+i),(start+p),ElemSize) > 0 ){
				BYTE_SWAP((start+i),(start+p),ElemSize);
				SWAP = 1;
			}
		}
	if( gap <= 1 && !SWAP ){
			break;
	}
	}
}

int main()
{
 int tab[] = { 56,1,784,-42,8,24,72,-98,153,13,255,27,-17,6,9421,-842,423,61,89,37,10,261,436,175,145 };
 const size_t MAX = sizeof(tab)/sizeof(tab[0]);
 size_t i;

 /* a essayer sur tous;float,long,meme char */
 for( i = 0 ; i < MAX ; ++i )
		printf("%d ",tab[i]);

 printf("\n");

 /* t1 = clock() */
 
 //CombSort(tab,MAX);

 /*
 * tab = Tableau a trier
 * MAX = Nombre d'entre dans le tableau
 * ElemSize = taille d'un seul element dans le tableau (sizeof(tab[0])
 * __CMP =  fonction de comapraison 
 */
 GenericCombSort((void *)tab,MAX,sizeof(int),__CMP);

 /* t2 = clock() */

 puts("Tableau Trier");
  for( i = 0 ; i < MAX ; ++i )
		printf("%d ",tab[i]);

  printf("\n");
#ifdef _WIN32
	getch();
#endif
 return 0;
}
 

 Conclusion

RÉFÉRENCE
http://www.nist.gov/dads/HTML/combSort.h tml
http://www.tscc.de/combsort.html
et les WIKIPEDIA of course

Voila A Vos LeS StuDios.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

13 décembre 2008 01:49:51 :
correction
13 décembre 2008 01:52:39 :
coorection 2
15 décembre 2008 00:32:19 :
Modification du titre pour le grand plaisir de brunews
15 décembre 2008 15:31:42 :
Ok maintenant le code compile sur Windows/Unix , j'ai inclus un zip pour le code ( projet Visual Studio 2008)

 Sources du même auteur

Source avec Zip Source avec une capture COMPRESSION FICHIERS ALGORITHME HUFFMAN C
Source avec Zip Source avec une capture CLEX ANALYSEUR LEXICALE DU LANGAGE C
ITOA FAIT MASION: COVERSION ENTIER 32 BIT NON SIGNE VERS CHA...
Source avec Zip Source avec une capture SHAMAN LIBRAIRIE DE HASH SUPPORTANT SHA1 SHA256 SHA384 SHA51...
Source avec Zip CONNEXION A UNE BD SQLITE

 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 Source avec une capture ALGORITHME DE TRI D'UN TABLEAU PAR ORDRE CROISSANT OU DÉCROI... par Thuzhen
Source avec Zip LE QUICKSORT NON-RECURSIF ET L'IMPACT DE L'INSERTIONSORT SUR... par nickydaquick
Source avec une capture COMPARAISON TRI + TEST CPU par lucastok2
Source avec Zip LIBRAIRIE CONTENANT UNE TRENTAINE D'ALGORITHMES DE TRI par xkamen
QUICKSORT - NON RECURSIF par nickydaquick

Commentaires et avis

Commentaire de CGSI3 le 14/12/2008 11:51:50

Je travail sur le meme type de procedure depuis 3 mois, mais en vb, elle est sensiblement identique sur le principe, je vous l'edite sur ce site en section VB
Je pense également que ce type de tri peut aller plus vite qu'un quicksort et je vous remercie pour l'algo.

Désolé pour la traduction vb/C++


Commentaire de BruNews le 14/12/2008 15:21:42 administrateur CS

NON, ceci ne rivalise en rien avec un bon quicksort.
http://www.cppfrance.com/code.aspx?id=48711

Commentaire de xtremejames183 le 14/12/2008 22:42:12

bien sur ca ne rivalise pas avec un BON QSort  si le pivot est bien choisis et la liste a trier est assez grande et que l'algo n'est pas récursif , je te l'accorde c vrai.
mais si la liste est de longueur moyenne et on veut du code léger et simple je préfére de loin combsort , sachant qu'il est utilisé par lighttpd le fameux serveur web ( vu et vérifié).
NB n'oublie pas la complexité  O(n2) au pire des cas du QSort

Commentaire de shenron666 le 14/12/2008 22:51:00

euh BruNews, je te croyaus plus mature que ça, c'et bien précisé que cet algo est plus rapide que tous les autres sauf Qsort mais qu'il est surtout beaucoup plus simple.
De plus, le Qsort peut aussi être plus lent qu'un shell ou un epi dans certains cas, et ça (j'espère) tu le sais aussi

Commentaire de BruNews le 14/12/2008 23:55:40 administrateur CS

SHENRON666,
relis le titre de la source et tu verras qu'il convient de préciser les choses clairement plutot que de laisser un débutant se faire berner.

Commentaire de shenron666 le 15/12/2008 00:00:27

oui vis-à-vis du titre je comprend
dans ce cas ne peux tu pas éditer le titre pour simplement retirer "AUSSI RAPIDE QU'UN QUICKSORT" ?

Commentaire de BruNews le 15/12/2008 00:13:16 administrateur CS

oh mais il n'y a ni agression ni mort d'homme à fournir précisions et mesures.
Un débat, même en commentaires de source, n'est fait pour nuire à personne.

Commentaire de gaspos le 15/12/2008 11:05:52

Petite question de quelqu'un qui s'intéresse plus à l'algo qu'à ses performances comparées :
ça sert à quoi le  "  if( gap == 9 || gap == 10 ) { gap = 11; }   "  ?

et puis, heu... je ne voudrais pas paraître immature et encore moi pénible, mais il ne compile carrément pas ce code.
Rien qu'en lisant j'ai remarqué le paramètre "d" de la macro BYTE_SWAP qui est en conflit avec la variable du même nom déclarée plus bas.
Et en copiant/collant dans un environnement de dev, aïe aïe aïe !
Je pensais qu'il fallait vérifier ce genre de truc avant de "publier"...
Mais, bon, c'est l'algo qui compte n'est-ce pas ?

En tous cas, c'est sympa que vue l'omniprésence du Quick Sort, il y ait encore des gens pour proposer des alternatives.
Merci

Gaspos

Commentaire de xtremejames183 le 15/12/2008 15:34:27

Gaspos :
Tu peux maintenant compiler correctement le code sous Win32/Unix , l'autre fois j'ai essayer d'ecrire simplement l'algorithme sans se soucier de la compilation.
A+

Commentaire de shenron666 le 15/12/2008 16:43:10

remplacer d par t n'a fait que remplacer le problème
tu as une variable t redéclarée dans ton while
tu pourrais au moins compiler ton code pour tester ce genre d'erreur
je te conseillerai même d'arrêter d'utiliser des variables courtes non explicites

Commentaire de xtremejames183 le 15/12/2008 17:27:38

SHERNON66:
la question n'es pas de remplacer d par t ou outre chose , c'est la vitesse d'exécution de l'algorithme , et pour ton grand plaisir tu peux enlever la fonction générique ainsi que toutes ses macros et tester que CombSort(int *tab,size_t NBElem);
Le code compile est tant-mieux.
A+.

Commentaire de shenron666 le 15/12/2008 17:38:01

bah laisses tomber, si tu ne sais pas accepter les critiques te signalant les erreurs répétées dans ton code tant pis, c'est sympa pour la lisibilité en tout cas d'avoir 2 variables t dans une macro, surtout si tu t'adresses à des débutants

Commentaire de darkpoulpo le 15/12/2008 18:55:25

je confirme, brunews tu as eu la réaction d'un ado. Surtout pour faire ton propre source juste pour s'amuser à demontrer celui-ci. Mais après je dis cela sans agression ni mort d'homme. Faut calmer cette agressivité...


Commentaire de BruNews le 15/12/2008 19:11:18 administrateur CS

Vous réfléchissez 2 mn sur ce que vous dites ?

On est en présence d'une source, non compilée ni compilable et donc pas d'exemple d'utilisation, qui affirme fournir un algo aussi performant que quicksort.

Si sur un site C/C++ on appelle "réaction d'ado" remettre les choses en place avec cette fois un exemple pour vérifier, c'est qu'on n'a pas les mêmes mots pour les mêmes définitions.
Quand je ne réagirai plus en "ado" en pareil cas, c'est qu'il sera temps de prendre ma retraite.

Commentaire de darkpoulpo le 15/12/2008 19:25:18

c'est écrit "peux rivaliser" ca ne veut pas dire de maniere égal. Je crois que tu te prends la tête pour rien, et frenchement il serait bon de prendre un peu de recul pour t'en appercevoir. Je ne sais pas si tu remarques, il n'y a que toi qui s'enflamme, alors que tout le monde est cool... après c'est toi qui voit, mais je pense que tu sais te remettre en question quand il le faut. voila, sujet clos parceque je sais que ca va dégéner et polluer pour rien.

 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 tri rapide (quicksort) et/ou tri par tas(heapsort) urgent [ par mersniyassine ] je trouve une difficulté a simuler graphiquement en C ces 2 trisya t-il quelqu'un qui peut me fournir un code.c compilable sur Turbo C qui effectue u 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],


Nos sponsors


Sondage...

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,842 sec (3)

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