在牛客网刷题遇到一个题目,看了很长时间不会写,本来想暴力26个字母一个一个字母对比,发现肯定超时,冒泡又太麻烦,快排自己写交换函数又有难度,在别人提交的代码中发现了一位大神,用了qsort函数,查了一下发现它就是C语言用来实现快速排序的
函数原型为:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数
- base -- 指向要排序的数组的第一个元素的指针。
- nitems -- 由 base 指向的数组中元素的个数。
- size -- 数组中每个元素的大小,以字节为单位。
- compar -- 用来比较两个元素的函数。
返回值
该函数不返回任何值
用法:
实现输出按字符顺序升序排序后的字符串
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compare(const void *a,const void *b){
return (*(char *)a- *(char *)b);
}
int main(){
char str[200];
scanf("%s",str);
qsort(str,strlen(str),1,compare);
printf("%s",str);
return 0;
}
注:在菜鸟看到一位大神写的评论关于compare函数:
compar 参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是 const void * 型,同时在调用 compar 函数(compar 实质为函数指针,这里称它所指向的函数也为 compar)时,传入的实参也必须转换成const void * 型。在 compar 函数内部会将 const void * 型转换成实际类型,见下文。
int compar(const void *p1, const void *p2);
如果 compar 返回值小于 0(< 0),那么 p1 所指向元素会被排在p2所指向元素的前面如果 compar 返回值等于 0(= 0),那么 p1 所指向元素与 p2 所指向元素的顺序不确定如果 compar 返回值大于 0(> 0),那么 p1 所指向元素会被排在 p2 所指向元素的后面。
所以,若把代码compare函数中return语句改成:return (*(char *)b- *(char *)a);则会实现降序排序