IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Que pensez-vous de mon qsort


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut Que pensez-vous de mon qsort
    Bonjour a tous,

    Pour un de mes projets de cours, je dois trier des tableaux de pleins de façon diffèrent. Bien sûr avec qsort de stdlib c'est facile, mais je n'y ai pas le droit

    Je viens donc de recoder mon propre qsort. Il fonctionne bien, mais je pense qu'il n’est pas au top de son optimisation (le malloc au début ).


    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    static void					*get_tmp(size_t width)
    {
    	static void				*tmp = NULL;
     
    	if (tmp == NULL)
    		tmp = ft_memalloc(width); // malloc + bzero
    	return (tmp);
    }
     
    static void					switch_value(void *left, void *right, size_t width)
    {
    	void					*tmp;
     
    	if ((tmp = get_tmp(width)) == NULL)
    		return ;
    	ft_memcpy(tmp, right, width); // like memcpy
    	ft_memcpy(right, left, width);
    	ft_memcpy(left, tmp, width);
    }
     
    static void					del_tmp(void)
    {
    	void					*tmp;
     
    	if ((tmp = get_tmp(0)) != NULL)
    		ft_memdel((void**)&tmp); // free and ptr = NULL
    }
     
    void						loop_qsort(void *base, size_t nel, size_t width,
    		int (*compar)(const void *, const void *))
    {
    	void					*pivot;
    	void					*end;
    	void					*right;
    	void					*left;
     
    	end = (void*)base + (nel - 1) * width;
    	right = end;
    	left = base;
    	pivot = base;
    	if (nel <= 1 || width <= 0 || end < base)
    		return ;
    	while (left < right)
    	{
    		while (left < right && compar(pivot, right) < 0)
    			right = (void*)right - width;
    		switch_value(left, right, width);
    		pivot = right;
    		while (left < right && compar(pivot, left) >= 0)
    			left = (void*)left + width;
    		switch_value(left, right, width);
    		pivot = left;
    	}
    	loop_qsort(base, (left - base) / width, width, compar);
    	loop_qsort((void*)left + width, (end - left) / width, width, compar);
    }
     
    void						ft_qsort(void *base, size_t nel, size_t width,
    		int (*compar)(const void *, const void *))
    {
    	if (nel <= 1)
    		return ;
    	loop_qsort(base, nel, width, compar);
    	del_tmp();
    }
    Pouvez-vous me donner vos avis dessus svp ? et si vous voyez des erreurs je suis dispo

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Puisque tu n'emploies ni VLA, ni alloca, je suppose que tu as la contrainte du C89/C90..

    Ton buffer déclaré static en revanche n'est pas une super idée : ça rend l'ensemble non réentrant pour pas grand chose (il est aisé d'y remédier).

    Je n'ai pas testé le programme ni lu son code en détail mais il me paraît correct sinon.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut
    Bonsoir Matt_Houston, merci pour ta réponse.

    Puisque tu n'emploies ni VLA, ni alloca, je suppose que tu as la contrainte du C89/C90..
    Oui je dois compiler en C89 .

    Ton buffer déclaré static en revanche n'est pas une super idée : ça rend l'ensemble non réentrant pour pas grand-chose (il est aisé d'y remédier).
    J'ai une contrainte que j'ai oublié de préciser. A mon école, je ne peux pas avoir une fonction qui attend plus de 4 paramètres. Apres je peux utiliser une globale static, mais je n'aime pas trop ca ... Après pour moi il restait que cette option... Je me trompe ?

    Il y a une chose que je trouve vraiment étrange et que je n'arrive pas à expliquer... Pour sort 1million de int random le vrai qsort a besoin d'environ 0,24 seconde. Moi il me faut 0.65 secondes

    Avez-vous une idée d'où peut venir cette diff ?

    Merci

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par fpasquer Voir le message
    J'ai une contrainte que j'ai oublié de préciser. A mon école, je ne peux pas avoir une fonction qui attend plus de 4 paramètres. [...] Après pour moi il restait que cette option... Je me trompe ?
    Règle à la con IMHO, enfin.. soit. Tu peux éventuellement swap sans buffer auxiliaire. Autrement, en conservant l'implémentation récursive et sans malloc à chaque niveau, tu n'as pas vraiment le choix effectivement.


    Citation Envoyé par fpasquer Voir le message
    Apres je peux utiliser une globale static, mais je n'aime pas trop ca ...
    Intrinsèquement c'est identique à ce que tu as fait là.


    Citation Envoyé par fpasquer Voir le message
    Il y a une chose que je trouve vraiment étrange et que je n'arrive pas à expliquer... Pour sort 1million de int random le vrai qsort a besoin d'environ 0,24 seconde. Moi il me faut 0.65 secondes

    Avez-vous une idée d'où peut venir cette diff ?
    Rien d'inquiétant, et c'est bon signe concernant l'implémentation du langage sur ta machine j'ai envie de dire, car les routines de base sont sensées être optimisées pour leur environnement.. Garde également en mémoire que malgré son nom, qsort ne permet en aucun cas de préjuger de la nature des algorithmes utilisés pour la réalisation du tri. En témoigne la note sur cppreference :
    Despite the name, neither C nor POSIX standards require this function to be implemented using quicksort or make any complexity or stability guarantees.
    On peut très bien imaginer qu'une implémentation opte pour le tri par insertion pour une quantité de données relativement restreinte, jusqu'à un certain seuil, puis bascule sur un tri fusion, etc..

Discussions similaires

  1. que pensez vous de mon site http://www.tout57.fr
    Par alain57 dans le forum Mon site
    Réponses: 4
    Dernier message: 21/01/2007, 12h47
  2. [Avis] Que pensez-vous de mon C.V.
    Par skynet dans le forum CV
    Réponses: 22
    Dernier message: 30/09/2006, 18h49
  3. Réponses: 11
    Dernier message: 09/09/2006, 15h54
  4. [SGBD/MLD]Que pensez vous de mon MLD?
    Par Bils dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 29/03/2006, 16h50
  5. que pensez vous de mon code source ecrit en c++(je debute)
    Par superspike23 dans le forum Débuter
    Réponses: 6
    Dernier message: 06/10/2005, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo