C++快速排序qsort函数介绍及其使用方法

qsort函数介绍

qsort函数介绍:

image.png
在使用该函数时,我们要清楚这几点:

1.该函数无返回值,其头文件为#include<stdlib.h>

2.其四个函数参数分别为:待排序数据中第一个对象的地址排序数据元素个数排序数据中每个元素大小,单位为字节用来比较待排序数据中两个数据的函数

3.比较函数的返回值必须为int,其参数类型为void类型的指针

3.qsort函数可用于任何数据类型的排序

接下来我会举几个例子,让我们更加清楚这个函数的使用。


例一:整型数据的排序

实例代码:

//qsort:快速排序函数--整型数据
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>     //printf
#include<stdlib.h>    //qsort
int cmp_int(const void* a, const void* b)
//比较整型数据
//存放的将要进行比较的两个函数的地址
{
	return (*((int*)a) - *((int*)b));
        //(int*)a:强制类型转换为整型指针
	//升序排列(从小到大)
        //如果a大于b,则返回1;如果a小于b,则返回-1;若相等,则返回0
	//return *((int*)b) - *((int*)a);
	//降序排列(从大到小)
}

int main()
{
	int arr[] = { 40,10,100,90,20,25 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int n = 0;
	qsort(arr, sz, sizeof(int), cmp_int);
        //qsort(数组名,数组内元素个数,数组内每个元素的大小,比较调用)
	for (n = 0; n < sz ; n++)
        //打印数组内的元素
	{
		printf("%d ", arr[n]);
	}

	return 0;
}
复制代码

输出结果(升序):

image.png
输出结果(降序):

image.png


例二:字符数据的排序

实例代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>     //printf
#include<stdlib.h>    //qsort
#include<string.h>    //strlen
int cmp_char(const void* a, const void* b)
//比较整型数据
//存放的将要进行比较的两个函数的地址
{
	return *(char*)a - *(char*)b;
	  //(char*)a:强制类型转换为字符指针
          //升序排列(从小到大)
	  //如果a的ASCLL值大于b,则返回1;
          //如果a的ASCLL值小于b,则返回-1;
          //若相等,则返回0
          //return *(char*)b - *(char*)a;
          //降序排列(从大到小)
}

int main()
{
	char arr[] = { 'b','d','c','f','q','o','p' ,'\0'};
	//字符数组排序
	int len = strlen(arr);
	printf("len=%d\n", len);
	//字符数组内字符个数
	int n = 0;
	qsort(arr, len, sizeof(char), cmp_char);
	//qsort(数组名,数组内元素个数,数组内每个元素的大小,比较调用)
	for (n = 0; n < len; n++)
        //打印字符数组中的元素
	{
		printf("%c ", arr[n]);
	}

	return 0;
}
复制代码

输出结果(升序):

image.png

输出结果(降序):

image.png


例三:结构体数据的排序

实例代码:

1:按年龄排序

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>      //printf
#include<stdlib.h>     //qsort
typedef struct Student
{
	char name[50];        //姓名
	int age;              //年龄 
}S;

int com_by_age(const void* a, const void* b)
{
	return ((S*)a)->age - ((S*)b)->age;
	//升序
	//按年龄大小排序
	//return ((S*)b)->age - ((S*)a)->age;
	//降序
}

int main()
{
	S s[] = { {"zhangsan",18},{"lisi",21},{"wangwu",20},{"liuqi",17} };
	//按年龄大小排序
	int n = 0;
	int sz = sizeof(s) / sizeof(s[0]);
        //数据的个数
	qsort(s, sz, sizeof(s[0]), com_by_age);
	for (n = 0; n < sz; n++)
        //打印结果
	{
		printf("%s %d\n", s[n].name, s[n].age);
	}

	return 0;
}
复制代码

输出结果(升序):

image.png
输出结果(降序):

image.png

2:按名字(ASCLL)排序

按名字排序跟strcmp函数一个道理,如果你忘了strcmp的功能是什么的话,可以点击strcmp查看。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>      //printf
#include<stdlib.h>     //qsort
#include<string.h>     //strcmp
typedef struct Student
{
	char name[50];        //姓名
	int age;              //年龄 
}S;

int com_by_name(const void* a, const void* b)
{
	return strcmp(((S*)a)->name , ((S*)b)->name);
	//升序
	//a>b,返回一个正数;a<b,返回一个负数;a=b,返回0;
        //return strcmp(((S*)b)->name , ((S*)a)->name);
        //降序
}

int main()
{
	S s[] = { {"zhangsan",18},{"lisi",21},{"wangwu",20},{"liuqi",17} };
	//按名字排序
	int n = 0;
	int sz = sizeof(s) / sizeof(s[0]);
        //数据的个数
	qsort(s, sz, sizeof(s[0]), com_by_name);
	//按名字排序
	for (n = 0; n < sz; n++)
        //打印结果
	{
		printf("%s %d\n", s[n].name, s[n].age);
	}

	return 0;
}
}
复制代码

输出结果(升序):

image.png

输出结果(降序):

image.png


本篇内容到这里就结束了,如果你觉得多少对你有点帮助的话,可以点赞或者收藏支持一波,欢迎大佬在评论区批评指正,我们下次再见!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享