qsort函数—— 快速排序

一、前言

我们想对一个数组进行排序时,会用到什么方法呢?冒泡排序?插入排序?快速排序...?

不管我们用哪个都需要我们进行复杂的编码,其实C语言库里就有相关的排序函数,就是我们接下来要介绍的qsort函数,它可以实现对 整形数组,字符数组,结构体,等等进行排序,它里面的内部排序规则其实就是我们熟悉的 快速排序 方法。

就让我们一起学习这个函数吧!!!

二、qsort函数介绍

2.1 头文件

qsort是stdlib.h中的函数,因此使用前需要声明:

#include

2.2  参数

 void qsort (void* base, size_t num, size_t size,
                  int (*compar)(const void*,const void*));

 qsort包括四个参数分别是:

1. 数组明(数组首元素地址) void * base

2. 数组的长度                           size_t  num

3. 数组中元素的字节大小         size_t  size

4. 排序原则                               int (*compar)(const void*,const void*));

参数是一个函数指针,指向一个函数,这个函数可以比较两个元素的大小

2.3 排序原则 int (*compar)(const void*,const void*))

指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素,进行两者之间的大小比较。

将两个指针作为参数(都转换为常量 void*)。该函数通过返回(以稳定和传递的方式)来定义元素的顺序:

1.  返回值  < 0 时,先指向的元素在后指向的元素之前

2.  返回值  = 0 时,先指向的元素等于后指向的元素

3.  返回值  0>  时,先指向的元素在手指向的元素之后

三、排序

3.1 对整型数组排序

因为p1,和p2是void类型指针,所以我们对整形排序时,就把p1,p2强制转换成(int*),然后在解引用,用p1,减去p2,就是从小到大的排序。

#include
#include

//qsort函数的使用者提供这个比较函数
int cmp_int(const void* p1, const void* p2)//void* - 无具体类型指针,所以它可以接收任意类型的地址
{
	return *(int*)p1 - *(int*)p2;
}

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//使用qsort来排序整型数组,这里就要提供一个比较函数,这个比较函数能够比较2个整数的大小
	//qsort 默认是排成升序的
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}

int main()
{
	test1();

	return 0;
}

3.2 对结构体中元素进行排序

struct Stu

{

        char name[20];

        int age;

};

 3.2.1 按年龄排序

同样我们需要把p1,p2强制转换成我们要排序目标的类型,这里就是结构体类型,所以我们p1,p2强制转换成(struct Stu*),然后在用(struct Stu*)指向age。

#include
#include
#include
//qsort 排序结构体数据
struct Stu
{
	char name[20];
	int age;
};

//按照年龄来比较
int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}


void test3()
{
	struct Stu s[] = { {"zhangsan",30},{"lisi",25},{"wangwu",50}};
	int sz = sizeof(s) / sizeof(s[0]);
	//测试按照年龄来排序
	qsort(s,sz,sizeof(s[0]),cmp_stu_by_age);

}

int main()
{
	test3();

	return 0;
}

3.2.2 按姓名排序

姓名排序也就是字符串排序,字符串比较大小我们可以用到strcmp函数。

#include
#include
#include
//qsort 排序结构体数据
struct Stu
{
	char name[20];
	int age;
};

//按照名字来比较
int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name);
}

void test3()
{
	struct Stu s[] = { {"zhangsan",30},{"lisi",25},{"wangwu",50}};
	int sz = sizeof(s) / sizeof(s[0]);
	//测试按照名字来排序
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

int main()
{
	test3();

	return 0;
}

四、总结

C语言的深度解剖 qsort() 函数,博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。欢迎在评论区指点江山!!!

你可能感兴趣的:(算法)