qsort函数的使用方法讲解

qsort函数是什么?

在C语言中,qsort是一个标准库函数,用于对数组进行排序。它位于stdlib.h头文件中。qsort函数使用快速排序(QuickSort)算法来对指定数组进行排序。它可以根据用户定义的比较函数对数组元素进行升序或降序排序。讲到排序我们先介绍一下冒泡排序

冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法,它依次比较相邻的元素并交换位置,将最大(或最小)的元素逐渐“冒泡”到正确的位置,如下图:
在这里插入图片描述
首先,将待排序的元素按照从左到右的顺序排列。
1.从第一个元素开始,比较相邻的两个元素的大小。
2.如果前一个元素大于(小于)后一个元素,则交换它们的位置。
3.继续比较下一对相邻元素,直到最后一对。
4.重复上述步骤,每次遍历都将最大的元素“冒泡”到正确的位置。
5.重复执行步骤2至步骤5,直到所有元素都排好序。
即数字两两比较,假设它们的下标为 0~9,0和1比较后接着 1和2再2和3,依次比较下去直到最后一对,9完成遍历后又从8开始遍历直到最后一个元素,当前面的元素大于(小于)后面的元素就交换他们的位置,10个数字两两比较次数为9,那么n位数字比较次数为n-1次。比较完了的数字确定位置后不再进行比较,那么比较的次数也会依次减少,比如上面9到0的数字,9比较完了不参与后面的数字的比较,既然不参与比较了剩下的数字就剩下9个,9个数字两两比较8次,直到最后剩下唯一一个数字后不再进行比较。下面我们看看冒泡排序的具体程序:

void bubble_sort(int arr[], int sz)
{
	//冒泡排序的总趟数
	int i = 0;
	for (i = 0; i < sz-1; i++) 
	{
		//一趟冒泡排序
		int j = 0;
		for (j = 0; j < sz-i-1; j++)
		{
			if (arr[j] > arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n\n");
}
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
	bubble_sort(arr, sz);
	print(arr, sz);
}

这是一个整形元素的排序,那么我想排序字符串、结构体等其它的呢?,那么上面的代码并不通用,只能单一的排序一种,需要排序其他的就需要设计一种新的代码程序。那么怎么才能解决这种问题呢?这就是下面介绍的qsort函数。即:

在C语言中,qsort是一个标准库函数,用于对数组进行排序。它位于stdlib.h头文件中。qsort函数使用快速排序(QuickSort)算法来对指定数组进行排序。它可以根据用户定义的比较函数对数组元素进行升序或降序排序。

qsort函数的原型

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

base:指向要排序的数组的第一个元素的指针。
num:数组中元素的数量。
size:每个元素的大小(以字节为单位)。
compar:比较函数的指针。(比较待排序数据中的两个元素的函数)

qsort函数的使用

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>

int cmp(const void* e1, const void* e2)
{
    //强制类型转换
	return *(int*)e1 - *(int*)e2;
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp);
	print_arr(arr, sz);
	return 0;
}

qsort函数参数细节分析

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

首先base作为排序的数组的第一个元素的指针,即地址。前面为什么有void * , 当我们使用qsort函数的时候从设计师角度想,他并不知道使用者是想要排序什么类型的信息,就只能设置一个 void * ,如果设置成int *,这里这里就只能传参整形指针,太单一,只能接受一种,也就只能排序一种,这里void * 类似一个垃圾桶,无论什么类型的指针都能放进去,那么就能接受任何类型的指针。num表示待排序内容数量,size表示一个元素的大小,为什么需要计算一个元素的大小,因为开始我们设置首元素的指针是void *,解引用后并不知道我们元素大小是多少,所以在这里设置元素的大小。知道一个元素的大小后qsort函数方便访问下一个元素。
那么 int (*compar)(const void *, const void *)); 的void *又是社么呢?比较函数的指针。(比较待排序数据中的两个元素的函数),同样的设计师在设计代码时,并不知道使用者需要比较什么类型的数据,所以使用void *用来接受任何类型的指针。而加上const表示只是比较他们的大小,不改变他们的值。
在这里插入图片描述

int cmp(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

当比较函数p1>p2返回值大于0;比较函数p1<p2返回值小于0;比较函数p1=p2返回值等于0

以升序的方式打印:
在这里插入图片描述

想要以降序的方式打印交换 e1 和 e2的位置

在这里插入图片描述

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值