qsort函数是C语言标准库中的一个函数,主要是用来对指定类型数组进行排序,使用的是快速排序算法,可以对任意类型的数据进行排序。
注意,qsort函数是stdlib库的一个函数,所以在使用前要先声明stdlib库
#include<stdio.h>
#include<stdlib.h>
qsort函数包含四个参数,如下所示
void qsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
第一个参数 base指向要排序的第一个元素,类型为void*
第二个参数 num代表待排序数组的元素个数
第三个参数 size代表待排序数组元素的大小(单位是字节)(对数据类型字节大小不太清楚的同学们,可以看我之前发的博客)跳转博客链接
第四个参数是一个整形函数指针*compar(),指向比较函数,比较函数会返回三种结果,如下所示
int compar(const void* e1,const void* e2){
if(*(int*)e1-*(int*)e2>0) return 1;
if(*(int*)e1-*(int*)e2==0) return 0;
if(*(int*)e1-*(int*)e2<0) return -1;
}
//因为e1和e2是const void* 类型,所以先要把e1和e2强制类型转换为int*类型,在进行解引用,才能进行比较,返回对应的结果
此外如果想让待排序数组递增排序,只需要把if条件判断语句中的e1和e2调换位置即可。
用法用例
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */
int compare (const void * a, const void * b){
return ( *(int*)a - *(int*)b );//如果a>b返回大于0的值,a=b返回0,a<b返回小于0的值,和上面的返回用法是一样的
}
int main (){
int arr[] = { 40, 10, 100, 90, 20, 25 };
int sz=sizeof(arr)/sizeof(int);
int i;
printf("排序前数组是:");
for(i=0;i<sz;i++){
printf("%d ",arr[i]);
}
printf("\n");
qsort (arr, sz, sizeof(int), compare);
printf("排序后数组是:");
for (i=0; i<sz; i++)
printf ("%d ",arr[i]);
return 0;
}
用法用例运行结果如下图所示
待排序数组是字符型数组
#include<stdio.h>
#include<stdlib.h>
int compare(const void* a, const void* b) {
return *(char*)a - *(char*)b;
}
int main() {
char arr[] = { 'e', 'd', 'a', 'f', 'b', 'c' };
int sz = sizeof(arr) / sizeof(char);
int i;
printf("排序前数组是:");
for (i = 0; i < sz; i++) {
printf("%c ", arr[i]);
}
printf("\n");
qsort(arr, sz, sizeof(char), compare);
printf("排序后数组是:");
for (i = 0; i < sz; i++)
printf("%c ", arr[i]);
return 0;
}
运行结果如下图所示
待排序数组是浮点型数组(float),如果是double只需要把float改成double即可
#include<stdio.h>
#include<stdlib.h>
int compare(const void *a,const void *b) {
if(*(float*)a>*(float*)b) return 1;
if(*(float*)a==*(float*)b) return 0;
if(*(float*)a<*(float*)b) return -1;
}
int main (){
float arr[] = { 40, 10, 100, 90, 20, 25 };
int sz=sizeof(arr)/sizeof(float);
int i;
printf("排序前数组是:");
for(i=0;i<sz;i++){
printf("%f ",arr[i]);
}
printf("\n");
qsort (arr, sz, sizeof(float), compare);
printf("排序后数组是:");
for (i=0; i<sz; i++)
printf ("%f ",arr[i]);
return 0;
}
运行结果如下图所示
待排序数组是结构体类型数组
#include<stdio.h>
#include<stdlib.h>
struct Stu {
char name[20];
int age;
};
int compare(const void* a, const void* b) {
return ((struct Stu*)a)->age - ((struct Stu*)b)->age;
}
int main() {
struct Stu arr[] = { {"张三",30},{"李四",20},{"王五",40}};
int sz = sizeof(arr) / sizeof(struct Stu);
int i;
printf("排序前数组是:");
for (i = 0; i < sz; i++) {
printf("%s %d ", arr[i].name,arr[i].age);
}
printf("\n");
qsort(arr, sz, sizeof(struct Stu), compare);
printf("排序后数组是:");
for (i = 0; i < sz; i++)
printf("%s %d ", arr[i].name, arr[i].age);
return 0;
}
运行结果如下图所示
qsort函数的时间复杂度是O(nlogn)
如果学会的话,做一个练习题吧,练习题链接放在下面了
力扣练习题
qsort函数的讲解就到此结束了,如果有什么不对的地方请指正!!感谢各位同学的访问。