begin process at 2012 02 09 14:55:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

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

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


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :quicksort, insertion, tri, rapide Niveau :Initié Date de création :17/06/2008 Vu / téléchargé :3 333 / 63

Auteur : nickydaquick

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

 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

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


 Sources du même auteur

ALGORITHME D'EUCLIDE ETENDU
QUICKSORT - NON RECURSIF

 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 COMPARATIF DES TRIS QUADRATIQUE par gnairod
Source avec Zip COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF par xtremejames183
Source avec une capture COMPARAISON TRI + TEST CPU par lucastok2
QUICKSORT - NON RECURSIF par nickydaquick
Source avec Zip ALGORITHMES DE TRIS par NNAS

Commentaires et avis

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+

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.

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;
  }
}

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.

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 ;)

Commentaire de Maroi le 29/04/2010 17:39:46

Salut
est ce que vous pouvez me donner un exemple de quicksort non récursif pour des réels?
Merci bcp

Commentaire de BruNews le 29/04/2010 21:43:20 administrateur CS

Des réels, double ou float, se trient exactement comme des entiers signés.

Exemple pour float, il n'y a quasi rien à changer.

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 = (int*) ptab; // CAST ICI ET BASTA
...
...

 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 alphabétique ultra rapide de chaines de caractères de longueur variable [ par mslider ] -- Bonjour, je sais que c'est un forum dédié au C mais je vais parler de pascal. En effet je connais bien ce langage et je l'ai utilisé pour trier a 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,


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,232 sec (4)

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