之前在写程序的时候,无论是查找还是排序基本上都是自己写程序,很少或者说从来没有用过C语言中的库函数来搞定这种问题,今天看书发现C语言其实把这种问题已经解决了,我们需要做的就是调用这样的函数就可以了
对于查找的数据我们使用
void *bsearch(const void *key,const void *base,size_t num,
size_t width,int (*cmp)(const void *v1,const void *v2));
上面的那个函数
其中key指向需要查找的那个元素,base是查找数据源(数组)的第一个元素,num指出数组包含的元素数,width指的是每个元素的宽度,cmp函数是比较函数
比较函数cmp必须满足两个要求
1、接受两个指向数据项的指针作为参数
2、返回这样的一个int值
a、如果元素1<元素2,则小于0
b、如果元素1=元素2,则等于0
c、如果元素1>元素2,则大于0
进行排序的的库函数qsort
void qsort(void *base,size_t num,size_t size,
int (*cmp)(const void *element1,const void *element2));
和上面的参数基本上的意义相当
例子:
排序算法
//#define NDEBUG
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <assert.h>
int intcmp(const void *v1,const void *v2);
int main()
{
srand(time(0));
int max_number;
printf("please input a number:\n");
scanf("%d",&max_number);
assert(max_number>0);
int *a = (int *)malloc(sizeof(int)*max_number);
for (int i=0;i<max_number;i++)
{
a[i] = rand()%100;
}
printf("before sorting:\n");
for (int i=0;i<max_number;i++)
{
printf("%d\t",a[i]);
if ((i+1)%5==0)
{
printf("\n");
}
}
printf("after sorting:\n");
qsort(a,max_number,sizeof(a[0]),intcmp);
for (int i=0;i<max_number;i++)
{
printf("%d\t",a[i]);
if ((i+1)%5==0)
{
printf("\n");
}
}
system("pause");
return 0;
}
int intcmp(const void *v1,const void *v2)
{
return *(int *)v1-*(int *)v2;
}
查找的例子:
这个必须是基于第一个排序完成,因为这个库函数要求,所要查询的数组必须是升序排列好的,因为是二分查找,二分查找要求查询的数据必须是有序的。
//#define NDEBUG
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <assert.h>
int intcmp(const void *v1,const void *v2);
int main()
{
srand(time(0));
int max_number;
printf("please input a number:\n");
scanf("%d",&max_number);
assert(max_number>0);
int *a = (int *)malloc(sizeof(int)*max_number);
for (int i=0;i<max_number;i++)
{
a[i] = rand()%100;
}
printf("before sorting:\n");
for (int i=0;i<max_number;i++)
{
printf("a[%d] = %d\t",i,a[i]);
if ((i+1)%5==0)
{
printf("\n");
}
}
printf("after sorting:\n");
qsort(a,max_number,sizeof(a[0]),intcmp);
for (int i=0;i<max_number;i++)
{
printf("a[%d] = %d\t",i,a[i]);
if ((i+1)%5==0)
{
printf("\n");
}
}
int number;
int *ptr;
printf("please input a number you want to search:\n");
scanf("%d",&number);
ptr = (int *)bsearch(&number,a,max_number,sizeof(a[0]),intcmp);
if (ptr!=NULL)
{
printf("the number %d at the location of a[%d]",number,ptr-a);
}
else
printf("%d not found!\n",number);
system("pause");
return 0;
}
int intcmp(const void *v1,const void *v2)
{
return *(int *)v1-*(int *)v2;
}