C语言库函数中的排序和查找函数

45 篇文章 2 订阅
31 篇文章 0 订阅

之前在写程序的时候,无论是查找还是排序基本上都是自己写程序,很少或者说从来没有用过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;
}


C函数手册,按照函数功能来分类 分类函数,所在函数为ctype.h int isalpha(int ch) 若ch 是字母('A'-'Z','a'-'z')返回非0 值,否则返回0 int isalnum(int ch) 若ch 是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非0 值,否则返回0 ...... 数学函数,所在函数为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i 的绝对值 double cabs(struct complex znum) 返回复数znum 的绝对值 double fabs(double x) 返回双精度参数x 的绝对值 ...... 目录函数,所在函数为dir.h、dos.h int chdir(char *path) 使指定的目录path(如:"C:\\WPS")变成当前的工作目录,成 功返回0 int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功 返回0 ...... 进程函数,所在函数为stdlib.h、process.h void abort() 此函数通过调用具有出口代码3 的_exit 写一个终止信息于stderr,并异常终止程序。无返回值 int exec…装入和运行其它程序 ...... 转换子程序,函数为math.h、stdlib.h、ctype.h、float.h char *ecvt(double value,int ndigit,int *decpt,int *sign)将浮点数value 转换成字符串并返回该字符串 char *fcvt(double value,int ndigit,int *decpt,int *sign)将浮点数value 转换成字符串并返回该字符串 ...... 诊断函数,所在函数为assert.h、math.h void assert(int test) 一个扩展成if 语句那样的宏,如果test 测试失败,就显示一个信息并异常终止程序,无返回值 void perror(char *string) 本函数将显示最近一次的错误信息,格式如下:字符串string:错误信息 ...... 输入输出子程序,函数为io.h、conio.h、stat.h、dos.h、stdio.h、signal.h int kbhit() 本函数返回最近所敲的按键 int fgetchar() 从控制台(键盘)读一个字符,显示在屏幕上 ...... 接口子程序,所在函数为:dos.h、bios.h unsigned sleep(unsigned seconds)暂停seconds 微秒(百分之一秒) int unlink(char *filename)删除文件filename unsigned FP_OFF(void far *farptr)本函数用来取远指针farptr 的偏移量 ...... 存贮分配子程序,所在函数为dos.h、alloc.h、malloc.h、stdlib.h、process.h int allocmem(unsigned size,unsigned *seg)利用DOS 分配空闲的内存,size 为分配内存大小,seg 为分配后的内存指针 int freemem(unsigned seg)释放先前由allocmem 分配的内存,seg 为指定的内存指针 ...... 操作函数,所在函数为string.h、mem.h mem…操作存贮数组 ...... ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值