Accueil > > > COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF
COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF
Information sur la source
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.
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
Sources de la même categorie
Commentaires et avis
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’une fonction f(x) sur l’intervalle [a; b],
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|