温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言库中函数qsort及bsearch快速排序算法怎么用

发布时间:2022-02-14 14:42:38 来源:亿速云 阅读:133 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关C语言库中函数qsort及bsearch快速排序算法怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    qsort

    qsrot 就是C语言库函数中的快速排序函数,对数组,结构体都可以实现快速排序, 他在头文件<stdlib.h>中使用,声明格式为:

    void qsort(void* base, size_t nums, size_t size, int (*compare)(const void *, const void*))

    这么烦人一长串的参数各是什么意思呢,base 是指向要排序的数组的第一个元素的指针。nums是由 base 指向的数组中元素的个数。size 是数组中每个元素的大小,以字节为单位。compare 是用来比较两个元素的函数,这个比较函数需要我们自己补全。

    含义

    void*代表着任意类型的数组,这个数组也就是我们想用来排序的对象数组;size_t 在系统里面被定义成 int 类型的,所以我们可以把 size_t修饰的数默认为一个整数。

    为什么要细化出数组大小和元素大小?这和我排序有毛关系?其实这是为了区分不同类型的数组,int 和 char 类型的数组每个元素所占空间就不一样,自然要区别开。

    int main()
    {
    	int arr[6] = { 1,4,5,8,2,3};
    	qsort(arr, 6, sizeof(arr[0]), compare);
    }

    最后的 compare 函数我是直接将这个元素作为参数传进来,那么问题来了,这个比较函数怎么写?

    我们根本不用管那个 *compare 的指针什么鬼,他就相当于告诉你这里在用一个外部函数,我们只要明白整个函数名儿上去就是妥妥的了,这个函数名不一定就叫 compare ,诸君自便。

    实现

    后面的(const void , const void)自然就是这个函数的参数了,两个 void* 实际运用的时候就看成 a ,b,既然是外部函数我们就要自己动手了,我们的最终目的是为了排序,比较函数就应该实现数组元素大小的比较,本质上说就是在比较 a和b 的大小,而a,b是我数组中任意的两两元素。

    那首先要做的就是把这个不知道什么类型的 void 指针变成我们给定的,之前代码中给的是整型数组,这里就要对应变成整型指针,这两个指针指向数组中的两个整数,既然要比较,我们就直接做减法看正负即可,把这两个指针转换成真正的整数后就大功告成了:

    	int* p = (int*)a;
    	int* q = (int*)b;
    	int c = *p;
    	int d = *q;

    成品如下:

    #include<stdlib.h>
    int compare(const void* a,const void* b)
    {
    	int* p = (int*)a;
    	int* q = (int*)b;
    	int c = *p;
    	int d = *q;
    	return c - d;
    }
    int main()
    {
    	int i = 0;
    	int arr[6] = { 1,4,5,8,2,3 };
    	qsort(arr, 6, sizeof(arr[0]), compare);
    	for (i = 0; i < 6; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }

    结果如下

    C语言库中函数qsort及bsearch快速排序算法怎么用

    结构体的排序也是同理,如下:

    #include<stdlib.h>
    int compare(const void* a,const void* b)
    {
    	int* p = (int*)a;
    	int* q = (int*)b;
    	int c = *p;
    	int d = *q;
    	return c - d;
    }
    int main()
    {
    	int i = 0;
    	int arr[6] = { 1,4,5,8,2,3 };
    	qsort(arr, 6, sizeof(arr[0]), compare);
    	for (i = 0; i < 6; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }

    结果就是根据结构体中 a 成员大小来排的:

    C语言库中函数qsort及bsearch快速排序算法怎么用

    格局打开

    1.上面是实现从小到大排列,要实现从大到小排只需 return d - c 即可。
    2.如果是比较浮点数,注意在两个数相差不大时,介于(-1,1),因为现在是整型指针,返回值也是整型,return 回来的就是个 0,造成无意义操作,怎么处理呢?很简单,改成如下即可:

    int compare(const void* a,const void* b)
    {
    	int* p = (int*)a;
    	int* q = (int*)b;
    	int c = *p;
    	int d = *q;
    	if(c - d<0)
    	{
    	return -1;
    	}
    	else
    	{
    	return 1;
    	}
    }

    bsearch

    bsearch (binary search)也是C语言库函数,功能是执行二分查找,声明定义如下

    void *bsearch(const void *key, const void *base, size_t nums, size_t size, int (*compar)(const void *, const void *))

    和 qsort 一样是又臭又长,且随我慢慢看,key 是指向要查找的元素的指针,类型转换为 void*,其他的和 qsort 里的是一样的不再赘述。

    强调一下,bsearch()的使用有一个硬性要求,这个数组必须要有顺序性,从大到小或从小到大否则达咩,所以建议和 qsort 配套实验更佳。

    这个 key 就是我们的查找目标,void* 代表着一个指针,所以我们在函数里面是不能直接给出的 key 的值,那我们就取他对应的地址就行

    	int key = 5;
    	bsearch(&key,arr,6,sizeof(int),compare1);

    接下来顺水推舟验证一下:

     judge = (int*) bsearch (&key, values, 5, sizeof (int), cmpfunc);
       if( judge != NULL ) 
       {
          printf("find %d is true\n", *judge);
       }
       else 
       {
          printf("%d can not be found\n", *judge);
       }
       
       return(0);
    }

    整个代码如下:

    #include<stdlib.h>
    int compare(const void* a, const void* b)
    {
    	int* p = (int*)a;
    	int* q = (int*)b;
    	int c = *p;
    	int d = *q;
    	return c - d;
    }
    int compare1(const void* key, const void* a)
    {
    	return (*(int*)key-*(int*)a);
    }
    int main()
    {
    	int* judge;
    	int arr[6] = { 1,4,5,8,2,3 };
    	qsort(arr, 6, sizeof(arr[0]), compare);
    	int key = 5;
    	judge = (int*)bsearch(&key, arr, 5, sizeof(int), compare1);
    	if (judge != NULL)
    	{
    		printf("find %d is true\n", *judge);
    	}
    	else
    	{
    		printf("%d can not be found\n", *judge);
    	}
    
    	return(0);
    }

    C语言库中函数qsort及bsearch快速排序算法怎么用

    感谢各位的阅读!关于“C语言库中函数qsort及bsearch快速排序算法怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI