csortingqsort

How does the compare function in qsort work?


I found this sample code online, which explains how the qsort function works. I could not understand what the compare function returns.

#include "stdlib.h"

int values[] = { 88, 56, 100, 2, 25 };

int cmpfunc (const void * a, const void * b) //what is it returning?
{
   return ( *(int*)a - *(int*)b ); //What is a and b?
}


int main(int argc, _TCHAR* argv[])
{

   int n;

   printf("Before sorting the list is: \n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }

   qsort(values, 5, sizeof(int), cmpfunc);

   printf("\nAfter sorting the list is: \n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }
    return 0;
}

Solution

  • int cmpfunc (const void * a, const void * b) //what is it returning?
    {
       return ( *(int*)a - *(int*)b ); //What is a and b?
    }
    

    Is equivalent to:

    int cmpfunc (const void * a, const void * b) //what is it returning?
    {
       // qsort() passes in `void*` types because it can't know the actual types being sorted
       // convert those pointers to pointers to int and deref them to get the actual int values
    
       int val1 = *(int*)a;
       int val2 = *(int*)b;
    
       // qsort() expects the comparison function to return:
       // 
       //    a negative result if val1 < val2
       //    0 if val1 == val2
       //    a positive result if val1 > val2
    
       return ( val1 - val2 ); 
    }