Fonction qsort

Entête à inclure

#include <stdlib.h>  // <cstdlib> en C++

Fonction qsort

void qsort( void * array, size_t elementCount, size_t elementSize,
            int (*compareFunction)( const void*, const void* ) );

Permet de trier un tableau d'éléments. Tous les éléments du tableau doivent être du même type (entiers, flottants, ...), mais vous avez le choix sur le type des éléments contenus. Comme la fonction qsort ne connais pas à l'avance ce type d'éléments, vous devez lui spécifier un certains nombre d'informations et notamment une fonction permettant de comparer les éléments deux à deux.

Comme c'est vous qui spécifiez la fonction de comparaison, vous avez le contrôle sur l'ordre de tri (ordre croissant ou ordre décroissant).

Après l'appel de cette fonction, le tableau contiendra les éléments ordonnés.

Paramètres

  • array : un pointeur sur le tableau de données à trier. Ce pointeur sera typé void * afin de permettre de contenir des éléments basés sur un type quelconque.
  • elementCount : le nombre d'élément contenu dans le tableau. N'oubliez jamais, qu'en C, un tableau ne mémorise pas sa taille. Il est donc de la responsabilité du développeur de se souvenir de cette taille.
  • elementSize : la taille (en nombre d'octets) occupée par un élément du type considéré. Le mieux étant de systématiquement faire appel à l'opérateur sizeof pour obtenir cette taille.
  • compareFunction : une fonction permettant de comparer deux éléments du tableau. Cette fonction doit obligatoirement être prototypée ainsi : int (*compareFunction)( const void * ptr1, const void * ptr2 ). Cette fonction doit, de plus, renvoyer :
    • une valeur < 0, si la valeur pointée par ptr1 est inférieure à celle pointée par ptr2
    • la valeur 0, si la valeur pointée par ptr1 est inférieure à celle pointée par ptr2
    • une valeur > 0, si la valeur pointée par ptr1 est supérieure à celle pointée par ptr2

Valeur de retour

Cette fonction ne renvoie aucune valeur.

Exemple de code

#include <stdio.h>          
#include <stdlib.h>

#define INT_ARRAY_COUNT 6
#define DOUBLE_ARRAY_COUNT 7

int intComparator ( const void * first, const void * second ) {
  return ( *(int*)first - *(int*)second );
}

int doubleComparator ( const void * first, const void * second ) {
  return (int) ( *(double*)first - *(double*)second );
}


int main() {
    
    int intArray[] = { 10, 50, 30, 20, 40, 60 };
    double doubleArray[] = { 1.2, 6.4, 7.4, 2.9, 4.3, 5.6, 8.1 };

    qsort( intArray, INT_ARRAY_COUNT, sizeof(int), intComparator );
    qsort( doubleArray, DOUBLE_ARRAY_COUNT, sizeof(double), doubleComparator );

    for( int i=0; i<INT_ARRAY_COUNT; i++ ) {
        printf( "%u - ", intArray[i] );
    }
    printf( "\n" );

    for( int i=0; i<INT_ARRAY_COUNT; i++ ) {
        printf( "%5.2lf - ", doubleArray[i] );
    }
    printf( "\n" );

    return 0;
}

Pour compiler et exécuter ce programme veuillez procéder ainsi :

$> gcc -Wall -o Sample Sample.c
$> ./Sample
10 - 20 - 30 - 40 - 50 - 60 - 
 1.20 -  2.90 -  4.30 -  6.40 -  5.60 -  7.40 - 
$>

Sujets connexes

bsearch