qsort函数的参数及其含义
首先,qsort这个函数需要有四个参数.后面我用数组给大家举例
假设我们所要排序的是 int arr[] = { 9,8,7,6,5,4,3,2,1,0 };这样一个数组
qsort的四个参数
base:指向待排序的第一个元素的地址,也就是数组首元素的地址,我们把数组名传过去就行 (数组名在大多数情况下指的是数组首元素的地址)
num:表示你想要排序的元素个数,数组的元素个数(size_t是表示无符号整型,也就是只能为正) 用int sz = sizeof(arr)/sizeof(arr[0])算出.
size:表示元素的大小,单位是字节.(用**sizeof(arr[0])**就能知道)
*compa:compa是函数指针,指向一个函数,这个函数是用来比较两个元素的,而后面的两个const void 是指向要比较的两个元素的地址.
qsort最后一个参数–函数指针详解
排序整型数组时,我们可以使用< >符号来操作,但是排列字符串,结构体呢?
不同的类型有不同的排序方式,而我们需要将这个排序方式传给qsort函数.让它清楚应该怎么样排序.
比较两个整型的函数的声明int cmp_int(const void* e1, const void* e2)
当e1指向的元素大于e2指向的元素时,返回大于0的数
当e1指向的元素等于e2指向的元素时,返回0
当e1指向的元素小于e2指向的元素时,返回小于0的数
需要注意的是函数名就是函数的地址,所以在使用qsort时我们直接传 cmp_int
对函数参数组装
qsort(arr,sz,sizeof(arr[0],cmp_int)
为什么这个函数传参有那么多空指针呢?
char类型的地址有char来接收, int 类型的地址有int 来接收.
而qsort不知道我们要排序的元素是什么类型,void*本身就像一个垃圾桶,能存任何类型的地址.
切记:
void*不能进行解引用操作,也不能通过±整数来操作.(相当于一个被束缚的垃圾桶,只能丢垃圾)只能通过强转类型来解除束缚.
cplusplus网站关于qsort函数的解释
qsort的头文件是<stdlib.h>
qsort函数排序整型数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;//强转void*成int* 从小到大
//return *(int*)e2 - *(int*)e1;// 从大到小
}
int main()
{
int arr[] = { 1,6,2,3,5,10,4,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
double类型,char类型与int排序相似
char类型:
int cmp_char(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
double类型:
int cmp_double(const void* e1, const void* e2)
{
return *(double*)e1 - *(double*)e2;
}
字符串类型与上面有些不同
int cmp_string(const void* e1, const void* e2)
{
return strcmp(*(char(*)[20])e1 ,*(char(*)[20])e2);
}
qsort排序结构体
用名字排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct man {
char name[20];
int age;
};
int cmp_by_name(const void* e1, const void* e2)//用名字进行排序
{
return strcmp(((struct man*)e1)->name, ((struct man*)e2)->name);
}
int main()
{
struct man arr[] = { {"zhangsan",16},{"lisi",36},{"wangwu",60},{"zhangfei",8} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_by_name);
return 0;
}
排序前:
排序后:
用年龄排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
struct man {
char name[20];
int age;
};
int cmp_by_age(const void* e1, const void* e2)//用年龄大小排序
{
return ((struct man*)e1)->age - ((struct man*)e2)->age;
}
int main()
{
struct man arr[] = { {"zhangsan",16},{"lisi",36},{"wangwu",60},{"zhangfei",8} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_by_age);
return 0;
}
排序前:
排序后:
总结
qsort快排函数需要四个参数,
1.voidbase:指明要排序的起始地址
2.size_t num:说明要排序的元素个数
3.size_t size:要排序的元素大小,比如int类型的大小是四个字节
4.int (compar)(const void,const void):函数指针,定义这些元素要怎么进行比较