【C语言】模拟实现与解析快速排序函数qsort


前言

我们曾经知道C语言排序有冒泡排序函数,选择排序函数等等,但这些自定义函数都不够普适,只能针对某类型的数据进行排序。C语言中有没有什么函数能够实现呢??
通过指针进阶我们了解到了回调函数,了解到了函数指针,那么现在,我们就可以来学习一种新的快速排序函数qsort了。这类函数对所有数据都适用,非常牛逼的一种函数!那么本篇文章将介绍C语言中快速排序函数qsort。通过简洁高效的代码,提供一个清晰明了的讲解,让我们开始吧!


基本冒泡排序函数

通过以往的学习我们可以很轻松的写出冒泡排序,代码如下:


#include<stdio.h>

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

void bubble_sort1(int arr[], int sz)//整型数据的冒泡排序函数
{
   
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)
	{
   
		for (j = 0; j < sz - 1 - i; j++)
		{
   
			if (arr[j] > arr[j + 1])
			{
   
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

void test1()
{
   
	int arr[] = {
   9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	print_arr(arr,sz);
	bubble_sort1(arr, sz);
	print_arr(arr, sz);
}
int main()
{
   
	test1();//用传统冒泡实现排序
	return 0;
}

但是很可惜只能针对某类型的数据进行排序,实在是有点鸡肋,既然qsort也是排序函数,那么接下来让我们了解一下它有什么独特的地方,试试能不能在冒泡排序的基础上进行优化,让我们一起看看吧~ =v=

什么是qsort函数

这里先分享一个网站:cplusplus
这个网站虽然看样子是C++的网站,但是也可以搜索有关C语言的相关函数知识。
不过要注意的是这个网站现在有新版,取消了搜索栏,如果是初学者建议找到这个按键进入旧版网站就可以进行搜索了,耶~在这里插入图片描述

好的好的!我们回到正题上来,经过我们的一顿搜索操作,找到了qsort函数的定义:qsort函数定义

看这么多英文头简直要爆了,实际上面这么大一堆文字直观有效的是红色的那一块,我们看这一部分就足够了。通过观察发现它的函数返回类型是void,函数参数有base,num,size和compar这一大堆参数,接下来我们将逐个进行讲解。Let‘s GO!

qsort函数原理

首先要说明一下,我们这里并不会具体深入展开qsort函数中的具体代码,我们只需了解它的函数逻辑,这样就已经足够我们进行实际的运用啦 😃

注意使用qsort时需要带上头文件:#include<stdlib.h>

1.首元素地址base

void* base //指向目标排序数组的首元素的指针(地址)

首元素地址base,它是指向目标排序数组的首元素的指针(地址),来确定具体排序的起点。
拿上面冒泡排序举例,此时如果想要排序,base所指就如图所示:
在这里插入图片描述

我们可以发现它的指针类型是void*,非常的耐人寻味,这里来讲讲它的奥妙。

void* 是无类型指针,他的作用是万金油,可以把任意元素类型的地址放入该指针中。如果要再使用就将其再强制转换为原类型即可。
你发现了吗?没错!!!!<

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值