震惊全网的qsort函数这可能是CSDN最全的讲解。

前言:后面还有模仿qsort函数的冒泡排序实现哦
在编写程序的过程中有很多排序算法,有冒泡排序,归并排序,还有今天的主角核心快速排序,这么快的算法,c语言中也为我们提供了这个函数qsort。听名字就是什么,就是一个字 ” 快!“,没错它是目前公认的最快的排序算法,这就是它的名字来源(说不定以后有更快的排序算法,这个快速排序就叫第二快排序算法,也不是没有可能)哈哈哈哈哈,开句玩笑,述说简短,我们这就开始正式介绍这个C语言为我们提供的快速排序函数qsort函数。

qsort函数简介

需要引用的头文件#include <stdlib.h>

功能:

使用快速排序例程进行排序。

函数声明:

void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *, const void*))

这里补充一下什么是void*: void *,任何类型的指针都可以直接赋值给它,无需进行强制类型转换,void
*也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。

①:base–> 是指向要排序的数组的第一个元素的指针。注意这里说是数组,所以必须是对连续的内存块进行排序。
②:nitems–> base指向数组的元素个数。
③:size–> 每各元素的大小
④:compare–> 指向函数的指针,指向函数的指针,指向函数的指针,重要的事情说3遍。(需要再定义一个比较函数),为什么需要在定义一个比较函数呢,如果这样一个快速排序的函数你用着很舒服很方便,你甘心只能用于一种类型的数据排序吗,所以再定义一个比较函数可以快速排序任何类型,比如结构体,数组,字符串,这样就会非常方遍,通用性得到了优化。

比较函数:

刚才我们说到了需要用户自己来定义一个比较函数,那么这个比较函数该如何来进行定义呢,请看。

int cmp(const void *S1, const void *S2);

为了通用性我们还是用void类型,注意const修饰是在‘ * ’号前,不是在‘ * ’号后。

举例int类型

#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* S1, const void* S2)//创建的比较函数
{
	return *(int*)S1 - *(int*)S2;//函数比较
}

int main()
{
	int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_int);//升序数组
	int i = 0;//下面是打印数组
	for (i = 0; i < len; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");
	return 0;
}

举例结构体类型

struct sum
{
	char name[20];//创建结构体
	int id;
};
int cmp_struct_name(const void* s1, const void* s2)//创建比较函数
{
	return strcmp(((struct sum*)s1)->name, ((struct sum*)s2)->name);//因为我们比较的是两个字符串,所以我们用到这个字符串比较函数。
}
int main()
{
	struct sum arr[3] = { { "zhang", 1996 }, { "wang", 2000 }, { "li", 1960 } };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_struct_name);//按姓名比较
	return 0;
}

模仿实现qsort函数冒泡排序:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* S1, const void* S2)
{
	return *(int*)S1 - *(int*)S2;
}
void swap(char* num1, char* num2, int size)
{
	int i = 0;
	char tmp = 0;
	for (i = 0; i < size; i++)
	{
		tmp = *num1;
		*num1 = *num2;
		*num2 = tmp;
		num1++;
		num2++;
	}
}
void my_qsort(void* base, int len, int size, int(*cmp)(const void* s1, const void* s2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < len; i++)
	{
		for (j = 0; j < len - i - 1; j++)
		{
			if (cmp( (char*)base+j * size, (char*)base + (j + 1) * size))//两个元素比较
			{
				swap((char*)base + j*size, (char*)base + (j + 1)*size, size);//交换
			}
		}
	}
}
int main()
{
	int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, len, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

感谢收看。结束。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值