### 9.3 Array Sort Function ¶

To sort an array using an arbitrary comparison function, use the `qsort` function. The prototype for this function is in `stdlib.h`.

Function: `void` qsort `(void *array, size_t count, size_t size, comparison_fn_t compare)` ¶

  Preliminary: | MT-Safe | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.

  The `qsort` function sorts the array array. The array contains count elements, each of which is of size size.

  The compare function is used to perform the comparison on the array elements. This function is called with two pointer arguments and should return an integer less than, equal to, or greater than zero corresponding to whether its first argument is considered less than, equal to, or greater than its second argument. The function must not alter the array’s contents, and must define a total ordering on the array elements, including any unusual values such as floating-point NaN (see Infinity and NaN). Because the sorting process can move elements, the function’s return value must not depend on the element addresses or the relative positions of elements within the array, as these are meaningless while `qsort` is running.

  Warning: If two elements compare equal, their order after sorting is unpredictable. That is to say, the sorting is not stable. This can make a difference when the comparison considers only part of the elements and two elements that compare equal may differ in other respects. To ensure a stable sort in this situation, you can augment each element with an appropriate tie-breaking value, such as its original array index.

  Here is a simple example of sorting an array of `long int` in numerical order, using the comparison function defined above (see Defining the Comparison Function):

      {
        long int *array;
        size_t nmemb;
        ...
        qsort (array, nmemb, sizeof *array, compare_long_ints);
      }

  The `qsort` function derives its name from the fact that it was originally implemented using the “quick sort” algorithm.

  The implementation of `qsort` attempts to allocate auxiliary memory and use the merge sort algorithm, without violating C standard requirement that arguments passed to the comparison function point within the array. If the memory allocation fails, `qsort` resorts to a slower algorithm.