C语言--快速排序【qsort函数的使用方法】

发布时间:2023年12月18日


一.快速排序的介绍🍗

快速排序是一种高效的排序算法,它基于分治的思想。算法的基本思路是选择一个基准元素(pivot),将待排序序列划分为两个子序列,一个子序列中的所有元素都小于基准元素,另一个子序列中的所有元素都大于基准元素。然后递归地对这两个子序列进行快速排序,最终将整个序列排序完成。
时间复杂度

快速排序的平均时间复杂度为O(nlogn),其中n是待排序序列的长度。在最好的情况下,即每次选择的基准都将序列均匀地划分为两个子序列,快速排序的时间复杂度可以达到最优情况的O(nlogn)。

然而,在最坏的情况下,即每次选择的基准都是序列中的最大或最小元素,导致划分不均匀时,快速排序的时间复杂度将变为O(n^2)。这种情况通常发生在待排序序列已经有序或近乎有序的情况下。

需要注意的是,快速排序的时间复杂度是基于平均情况和最坏情况来衡量的,对于一般情况下的随机序列,快速排序的平均时间复杂度是O(nlogn)级别的。此外,快速排序是一种原址排序算法,不需要额外的辅助空间。

最优:O(nlogn)

最坏:O(n^2)


二.快速排序在C语言中如何使用🍗

qsort:快速排序函数,需要引用stdlib.h文件.
void qsort(
	void* base,
	size_t num,
	size_t width,
	int(__cdecl* compare)(const void*, const void*)
);
//参数:
//base:需要排序的数组
//num : 数据个数(数组长度)
//width : 每个数据的字节数(sizeof(数据类型))
//compare : 比较大小的依据

在进行排序时,一定需要比较两个数据的大小,由于qsort能对任意的数据进行排序,那么它无法知道排序的规则,这个需要使用的人通过参数把这个传递给qsort,也就是上面的compare参数.

下面列举一些利用qsort的应用示例.?

1.对char类型排序(注意是字符,不是字符串)

2.对int类型排序

3.对double类型排序?

4.对Student(结构体)类型,按姓名排序?

5.对Student(结构体)类型,按分数排序


1.对char类型排序🍗

#include<stdio.h>
#include<stdlib.h>
//对单个字符进行排序
int Cmp_char(const void* vp1, const void* vp2)
{
	return *(char*)vp1 - *(char*)vp2;
}
int main()
{
	char str[] = "dafjkfladsj";
	qsort(str, strlen(str), sizeof(char), Cmp_char);//注意这里要用strlen函数求字符串长度
	printf("%s", str);
	return 0;
}
??????

2.对int类型排序🍗

#include<stdio.h>
#include<stdlib.h>
//快速排序 对int型整数排序
int Cmp_int(const void* vp1, const void* vp2)
{
	return *(int*)vp1 - *(int*)vp2;//默认是升序,降序需要整体加一个括号,再加负号
}
int main()
{
	int arr[] = { 22,4,5,745,65,45,-2 };
	qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(int), Cmp_int);
	for (int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
		printf("%d ", arr[i]);
	return 0;
}

3.对double类型排序?🍗

#include<stdio.h>
#include<stdlib.h>
//对double类型进行排序 注意要用一个临时变量
int Cmp_double(const void* vp1, const void* vp2)
{
	double tmp = *(double*)vp1 - *(double*)vp2;
	if (tmp > 0)
		return 1;
	else if (tmp < 0)
		return -1;
	else
		return 0;
}
int main()
{
	double arr[] = { 12.2,213.2,11.2,11.3,11.4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(double), Cmp_double);
	for (int i = 0;i < sz;i++)
	{
		printf("%.1lf ", arr[i]);
	}
	return 0;
}

4.对Student(结构体)类型,按姓名排序?🍗

#include<stdio.h>
#include<stdlib.h>
//对学生结构体进行排序--姓名
typedef struct Student
{
	char name[20];
	int score;
}Student;
int Cmp_stu_name(const void* vp1, const void* vp2)
{
	return strcmp(((Student*)vp1)->name , ((Student*)vp2)->name);//注意优先级 vp2直接复制前面的vp1
	//strcmp(字符串1,字符串2)
}
int main()
{
	Student arr[] = { {"liubei",80},{"caocao",70},{"sunquan",90},{"zhangfei",30},{"guanyu",85} };
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(Student), Cmp_stu_name);
	for (int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
	{
		printf("%s\n", arr[i].name);
	}
}


5.对Student(结构体)类型,按分数排序🍗

#include<stdio.h>
#include<stdlib.h>
//对学生结构体进行排序--分数
typedef struct Student
{
	char name[20];
	int score;
}Student;
int Cmp_stu_score(const void* vp1, const void* vp2)
{
	return ((Student*)vp1)->score - ((Student*)vp2)->score;//注意优先级 vp2直接复制前面的vp1
}
int main()
{
	Student arr[] = { {"liubei",80},{"caocao",70},{"sunquan",90},{"zhangfei",30},{"guanyu",85} };
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(Student), Cmp_stu_score);
	for (int i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
	{
		printf("%d ",arr[i].score);
	}
}

以上是对qost函数的举例,在需要排序的时候,直接使用就可以了
如果喜欢的话请给小编一个免费的赞以表鼓励吧🍗
文章来源:https://blog.csdn.net/m0_75266675/article/details/134996266
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。