

#include <stdlib.h>
void qsort(void *blk, size_t n, size_t size,
int (*cmp)(const void *, const void *));
qsort sorts the array pointed to by blk, using the quicksort
algorithm. n is the number of elements in the array. size is
the element size in bytes. cmp is a user-provided comparison function.
qsort calls cmp with pointers to two elements of the array.
cmp determines which element is larger or whether the two elements
are equal. The cmp function thereby defines the ordering relation
for the elements to be sorted. The precise comparison technique that
should be implemented by the cmp function depends on the type of
data to be compared and on the application. A typical comparison
function is illustrated under EXAMPLE below.
cmp returns these values:
qsort has no return value.
#include <stdlib.h>
#include <stdio.h>
#define MAXEMPLOY 100
#define EMPLOYEE_FILENAME "employee"
typedef struct { /* Define employee record. */
unsigned employ_no;
char last_name[30];
} employee;
employee emp_tabl[MAXEMPLOY];
/* Compare function for bsearch and qsort. */
static int compare_employees(const void *, const void *);
main()
{
FILE *employ_file;
int employ_count = 0;
unsigned srchid; /* Search value (employee id). */
char *temp_emp;
employ_file = fopen(EMPLOYEE_FILENAME, "rb");
/* Error checking omitted. */
/* Read in employee file. */
while (!feof(employ_file)) {
fread(&emp_tabl[employ_count], sizeof(employee),
1, employ_file);
++employ_count;
}
fclose(employ_file);
/* Sort employee table by employee number. */
qsort(emp_tabl, employ_count, sizeof(employee),
&compare_employees);
puts("Enter Employee ID to Search for:");
scanf("%d", &srchid); /* Enter search data. */
/* Do a lookup with bsearch for an entry in the */
/* employee table. It uses the same */
/* compare_employees function. */
temp_emp = bsearch(&srchid, emp_tabl, employ_count,
sizeof(employee), &compare_employees);
if (temp_emp == NULL) /* Print results of search. */
printf("Invalid IDn");
else
printf("Last Name: %sn",
((employee *) temp_emp)->last_name);
}
static int compare_employees(const void *first,const void *second)
{
employee *efirst, *esecond;
efirst = (employee *)first;
esecond = (employee *)second;
/* Return -1 if first emp no < second emp, 0 if */
/* they are equal, or 1 if first > second. */
return (efirst->employ_no > esecond->employ_no) -
(efirst->employ_no < esecond->employ_no);
}
bsearch
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.