Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LE QUICKSORT NON-RECURSIF ET L'IMPACT DE L'INSERTIONSORT SUR SES PERFORMANCES


Information sur la source

Description

Je depose cette source en rapport avec une discussion sur les performances du tri rapide (quicksort) qui pourraient etre ameliorees en visant une implementation non-recursive. Je me suis penche sur l'apport cote performance d'une autre methode de tri elle aussi tres rapide, sur des morceaux du tableau a trier de taille moindre lors du processus.  
  
    J'ai pour cela , par recurrence, demontrer que la taille maximale de la pile a allouer pour sauvegarder les index de tableau de taille N est le nombre binaire le plus proche >= N note N2.Par exemple si votre tableau est de 1000 items, la pile ne depassera pas les 1024 items (512 index de debut et 512 index de fin).
    Ici vous pouvez modifier le code a votre guise. J'ai utiliser un tableau d'entiers. Les variables pour tester les performances et l'impact sont INSERTION_SORT_LIMIT(taille limite du tableau en dessous de laquelle on realise un insertionSort au lieu d'un quicksort) et ARRAY_SIZE pour la taille du tableau.

 

Source

  • // voir le Zip - source main.cpp windows Visual c++ 2005 professionnel
// voir le Zip - source main.cpp windows Visual c++ 2005 professionnel

Conclusion

J'espere que vous serez nombreux a realiser des tests et a les rapporter pour comparer, ou corriger et/ou ameliorer la source. Pour ma part voici le resultat pour un exemple-test de configuration:

Hardware: Hewlett-Packard m8307c
          Intel Core2 Quad CPU Q6600 @ 2.40Ghz 2.40Ghz
          RAM = 3Gb
          Vista 32bits

INSERTION_SORT_LIMIT = 500
ARRAY_SIZE = 10000000;//10 millions

temps d'execution moyen : 818 ms (millisecondes).
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Pistol_Pete le 18/06/2008 09:41:06

Salut

Voila mes resultats pour 10 millions:  166 ms
AMD Athlon 64 X2 Dual
Core processor 6000+
3 GHz
XP sp3

Et puisse que l'on parle de performance, je ne comprend pas pourquoi ce programme n'est pas multithread...
Utiliser la moitier de la puissance de son PC, ca ne te gene pas?
Je suis sur que pour des plus grandes listes le gain sera immense. Ca serai cool de pouvoir tester.

A+

signaler à un administrateur
Commentaire de nickydaquick le 18/06/2008 09:46:59

Salut,
Merci pour le commentaire, effectivement le tri de tableaux en parallèle pourrait avoir un impact mais je doute qu'il y ait un gain significatif. cependant , tu as raison , je vais modifier la source et des que le temps me le permettra je déposerait une autre source, multithreaded, en rapport avec celle-ci ... histoire de comparer.

signaler à un administrateur
Commentaire de BruNews le 18/06/2008 19:56:57 administrateur CS

Salut,

le gros problème avec ce genre de tri c'est qu'il ne peut aller en prod dans un prog qui effectue des tris sur de gros tableaux pour la simple raison qu'il fait une alloc qui risque de ne pas réussir. Un algo de tri doit fonctionner à tout coup et la seule méthode certaine est un tri sur place sans aucune alloc.
On évacue la discussion sur la récursivité, il est clair que si un quicksort est récursif, il ne reste que le 'sort' mais plus du tout le 'quick'.

Essaie avec ça, j'ai fait qlqs tests et il me semble que c'est au moins aussi rapide (voire +) avec garantie de finir le tri qlq soit la taille du tableau:

#define STKSIZ (8 * sizeof(void*) - 2)

__inline void ShortsortLong(int *lo, int *hi)
{
  int *p, *max, v;
  while(hi > lo) {
    max = lo;
    for(p = lo + 1; p <= hi; p++) {
      if(*p > *max) max = p;
    }
    v = *max; *max = *hi; *hi = v;
    hi--;
  }
}

void __stdcall triInts(int *ptab, DWORD count)
{
  int *lo, *hi, *mid, *loguy, *higuy, v;
  int *lostk[STKSIZ], *histk[STKSIZ];
  size_t size;
  int stkptr = 0;
  lo = ptab;
  hi = lo + (count - 1);   /* DERNIER ELEM */
recurse:
  size = (hi - lo) / sizeof(long) + 1;   /* NBR ELEMS A TRIER */
  if(size <= 8) {
    ShortsortLong(lo, hi);
    goto goSTACK;
  }
  mid = lo + (size / 2);   /* ELEM CENTRAL */
  if(*lo > *mid) {v = *lo; *lo = *mid; *mid = v;}
  if(*lo > *hi) {v = *lo; *lo = *hi; *hi = v;}
  if(*mid > *hi) {v = *mid; *mid = *hi; *hi = v;}
  loguy = lo;
  higuy = hi;
  for(;;) {
    if(mid > loguy) {
      do {
        loguy++;
      } while(loguy < mid && *loguy <= *mid);
    }
    if(mid <= loguy) {
      do {
        loguy++;
      } while(loguy <= hi && *loguy <= *mid);
    }
    do {
      higuy--;
    } while (higuy > mid && *higuy > *mid);
    if(higuy < loguy) break;
    v = *loguy; *loguy = *higuy; *higuy = v;
    if(mid == higuy) mid = loguy;
  }
  higuy++;
  if(mid < higuy) {
    do {
      higuy--;
    } while(higuy > mid && *higuy == *mid);
  }
  if(mid >= higuy) {
    do {
      higuy--;
    } while(higuy > lo && *higuy == *mid);
  }
  if(higuy - lo >= hi - loguy) {
    if(lo < higuy) {
      lostk[stkptr] = lo;
      histk[stkptr] = higuy;
      ++stkptr;
    }
    if(loguy < hi) {
      lo = loguy;
      goto recurse;
    }
  }
  else {
    if(loguy < hi) {
      lostk[stkptr] = loguy;
      histk[stkptr] = hi;
      ++stkptr;
    }
    if(lo < higuy) {
      hi = higuy;
      goto recurse;
    }
  }
goSTACK:
  if(--stkptr >= 0) {
    lo = lostk[stkptr];
    hi = histk[stkptr];
    goto recurse;
  }
}

signaler à un administrateur
Commentaire de BruNews le 18/06/2008 20:01:42 administrateur CS

Pour ce qui est du multi thread, je ne suis pas convaincu du tout d'aller créer un thread pour un algo restant dans les milli secondes. La crétion d'un thread risque fort de consommer autant que le temps de tri.

signaler à un administrateur
Commentaire de MuPuF le 21/06/2008 12:46:22

Salut Brunews, Je suis pas entièrement d'accord avec toi sur le fait de ne pas créer une thread.
Grâce à la librairie Intel (TBB), on peut définir des seuils avant qu'une autre thread soit exécutée (granularité), ça permet lors de tri d'énormes tableaux d'utiliser le 2eme (ou plus) processeur et on est libre sur le choix de quand l'utilisation de la(/ces) thread(s) apporte un interêt.

C'est sur que dans l'absolu, si on avait pas cette librairie, dans 99% des cas, la création d'une thread serait contre productif, mais faut aussi se pencher sur les concepts qu'essaye de diffuser Intel. Je ne dis pas que c'est la panacée, mais ça a le mérite d'exister et d'être déjà pas mal efficace.

bon week end ;)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

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 tri par insertion dans une liste chaînée [ par titi4659 ] Bonjour,j'ai un problème avec une liste chaînée.j'ai une liste d'element que j'arrive a récupéré mais je souhaiterai que lorsque je récupère un elemen Tri par insertion sur listes simplement chainées [ par ichigoZ710 ] Bonjour, voilà, je vous explique rapidement mon problème, je dois élaborer une procédure de tri par insertion sur une liste qui vient en paramètre de tri insertion langage C et appel de fonction [ par washh ] Bonjour,Je débute en langage C et j'ai écrit l'algorithme du tri d'un tableau contenant des chaines de caractères, mais dès la compilation, le program Tri par insertion sur liste simplement chainée [ par Jordy89 ] Bonjour,Dans le cadre de la manipulation d'une liste chaînée, je suis amené à effectuer un tri; Je me suis renseigné à gauche et à droite, et il appar tri rapide(quicksort)+tri par tas(heapsort)+simulation graphique [ par mersniyassine ] mon stage d'ete comporte une simulation graphique du tri par tas et du tri rapide, je trouve une difficulté a gerer le code source,merci bien de me fo encore un pb en c svp....... [ par natacha86 ] j'ai essayer de s&#233;parer les fonctions mais ca ne marche pas...#include &lt;conio.h&gt;#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include & a l aiiiiiiiiidddddeeeeeeeee [ par natacha86 ] je ne comprend pas pkoi le programme une fois qu'il a lanc&#233; le premier choix du menu a la fin il ne reviens pas au menu, il s'arrete directement, menu avec un switch [ par natacha86 ] je ne comprend pas pkoi le programme une fois qu'il a lanc&#233; le premier choix du menu a la fin il ne reviens pas au menu, il s'arrete directement, aide par rapport a l'appel d'une méthode [ par natacha86 ] quel est le probleme de ma m&#233;thode init_tab ? le programme s'arrete aprse etre pass&#233; dans cette m&#233;thode, il plante, et ne rentre pas da


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.