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

来源:互联网 发布:淘宝手办怎么验货拒签 编辑:程序博客网 时间:2024/05/20 06:37

之前在写程序的时候,无论是查找还是排序基本上都是自己写程序,很少或者说从来没有用过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);}elseprintf("%d not found!\n",number);system("pause");return 0;}int intcmp(const void *v1,const void *v2){return *(int *)v1-*(int *)v2;}


0 0
原创粉丝点击