目录
对较大型的数组而言,快速排序方法是最有效的排序算法之一,。它将数组不断分成更小的数组,直到变成单元素数组。首先,将数组分成两部分,一部分的值都小于另一部分的值,这个过程一直持续到数组完全有序为止。
qsort
标准函数qsort()是对一个具有任意类型的数组进行排序,其中单个元素的大小和待比较元素的函数都是给定的。
描述
C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 对数组进行排序。
声明
下面是 qsort() 函数的声明。
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数
base -- 指向要排序的数组的第一个元素的指针。
nitems -- 由 base 指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数。
返回值
该函数不返回任何值。
bsearch
bsearch 为二分查找智能在有序数组中使用。
描述
C 库函数 void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)) 对 nitems 对象的数组执行二分查找,base 指向进行查找的数组,key 指向要查找的元素,size 指定数组中每个元素的大小。
数组的内容应根据 compar 所对应的比较函数升序排序。
声明
下面是 bsearch() 函数的声明。
void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
参数
key -- 指向要查找的元素的指针,类型转换为 void*。
base -- 指向进行查找的数组的第一个对象的指针,类型转换为 void*。
nitems -- base 所指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数。
返回值
如果查找成功,该函数返回一个指向数组中匹配元素的指针,否则返回空指针。
示例
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
typedef struct _student
{
char name[8];
float height, weight;
char sex;
} student_t;
student_t student_table[] =
{
{ "Jack", 170, 76, 'm'},
{ "mary", 164, 50, 'f' },
{ "Tom", 178, 80, 'm' },
{ "John", 174, 77, 'm' }
};
int name_compare(const void *e1, const void *e2)
{
return strcmp(((student_t *)e1) -> name, ((student_t *)e2) -> name);
}
int main(void)
{
student_t st = {"Tom", 0, 0, 0};
qsort(student_table, sizeof(student_table) / sizeof(student_table[0]),sizeof(student_table[0]), name_compare);
for(int i = 0;i< (sizeof(student_table) / sizeof(student_table[0]));i++)
{
printf("%s \r\n", student_table[i].name);
}
student_t *p_student = bsearch(&st, student_table, (sizeof(student_table) / sizeof(student_table[0])), sizeof(student_table[0]), name_compare);
printf("%s,%f,%f,%c \r\n", p_student -> name,p_student -> height, p_student -> weight, p_student -> sex);
return 0;
}
运行环境:C-Free 5.0
运行结果: