1. Overview of the qsort
Function
The qsort
function, provided in the C standard library, is a powerful tool for sorting elements within an array. Using the quicksort algorithm, qsort
can efficiently rearrange data at high speed. This section explains the basics of qsort
and discusses why this function is essential for C programming.
What is qsort?
qsort
is a versatile function that sorts arrays or lists based on a user-defined comparison function. As a standard function in C, it is widely used in various development environments. For example, you can efficiently sort arrays of integers, arrays of strings, and even arrays of structures.
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int values[] = {40, 10, 100, 90, 20, 25};
size_t values_len = sizeof(values)/sizeof(values[0]);
qsort(values, values_len, sizeof(int), compare);
for(int i = 0; i < values_len; i++) {
printf("%d ", values[i]);
}
return 0;
}
The code above demonstrates a basic example of sorting an integer array using qsort
. Here, a comparison function determines the order of elements within the array.
2. qsort Parameters and Usage
The prototype for qsort
is as follows:
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
Parameter Details
- base: Pointer to the first element of the array to be sorted.
- num: Number of elements in the array.
- size: Size of each element in bytes.
- compar: Pointer to the comparison function.
This function sorts elements based on the comparison function. compar
takes two elements as arguments and returns which is greater. This flexibility allows you to sort various data types.
How to Create a Comparison Function
The comparison function is the key to how qsort
works. You define a function that compares two elements, as shown below:
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
This function compares the values of a
and b
. It returns a negative value if a
is less than b
, 0 if equal, or a positive value if greater. This lets qsort
sort the array in ascending order.
3. How qsort Works Internally: The Quicksort Algorithm
qsort
uses the quicksort algorithm internally. Quicksort is a divide-and-conquer algorithm that works as follows:
- Select a Pivot: Choose a pivot element, often from the middle or end of the array.
- Partition: Move elements smaller than the pivot to the left, and greater elements to the right.
- Recursive Sort: Recursively repeat the process for each sub-array.
This process of dividing and combining allows the array to be sorted efficiently. Quicksort’s average time complexity is O(n log n), making it much faster than many other sorting algorithms. However, in the worst case (like already sorted arrays), the complexity can degrade to O(n^2), so care is needed.

4. Creating Comparison Functions
The power of qsort
lies in its ability to use custom comparison functions for different data types. Below are examples for different data types.
Comparison Function for Integers
int compare_int(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
Comparison Function for Strings
int compare_str(const void *a, const void *b) {
return strcmp(*(const char**)a, *(const char**)b);
}
Comparison Function for Structures
struct Person {
int id;
const char* name;
};
int compare_person(const void *a, const void *b) {
return ((struct Person*)a)->id - ((struct Person*)b)->id;
}
With custom comparison functions like these, qsort
can flexibly sort arrays based on their content.
5. Sorting Arrays of Structures with qsort
qsort
is especially useful for sorting arrays that contain structures. For example, consider sorting an array of Person
structures by their id
field:
struct Person people[] = {
{1, "Alice"},
{3, "Charlie"},
{2, "Bob"}
};
qsort(people, 3, sizeof(struct Person), compare_person);
By using the compare_person
function, you can sort by id
and arrange the order as Alice
, Bob
, and Charlie
.
6. Performance Optimization and Comparison with Other Algorithms
Quicksort Performance
Quicksort is highly efficient when dealing with random data, with an average time complexity of O(n log n). However, for already sorted data, its worst-case performance can drop to O(n^2). Therefore, while quicksort is recommended for random datasets, other algorithms may be better under specific conditions.
Comparison with Heapsort
Heapsort offers stable performance at O(n log n) even in the worst case, making it more consistent than quicksort. Still, quicksort is typically faster on average with random data, so it remains a preferred choice in most scenarios.
Comparison with Mergesort
Mergesort is also a stable sorting algorithm with O(n log n) complexity. It is suitable when stable sorting (maintaining the original order for equal elements) is required. While quicksort is not stable, for most common applications this isn’t a significant issue.
7. Conclusion
qsort
is a powerful sorting function available in C, known for its flexibility and speed. By using custom comparison functions, you can sort arrays of various data types and structures, which makes qsort
highly practical for real-world use.
Understanding the quicksort algorithm enables you to get the most out of qsort
. Depending on your dataset and requirements, consider comparing with other algorithms like heapsort or mergesort to optimize performance.
Try applying qsort
appropriately in your future development projects to write more efficient C programs.