快排函数qsort的使用(c语言)

214 阅读4分钟

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):函数指针,定义这些元素要怎么进行比较