qsort介绍以及模拟实现

发布于:2022-12-02 ⋅ 阅读:(407) ⋅ 点赞:(0)

各位大佬,即使是国庆也不要忘了学习呦,所以今天我要介绍的就是qsort函数。

qsort函数是c语言标准库里的函数,它可以用来排序各种类型的数据,比如:int类型、结构体类型、char类型等等。

那么他是如何使用的呢?请看下文:

qsort相关头文件:#include<stdlib.h>。在使用qsort函数之前先引入头文件。

函数原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

我们可以观察到qsort的返回类型为空,更重要的是他的第一个参数是void*,这就意味着我们可以传入任何类型的数据。从而可以给各种类型的数据排序。而后面的num表示的是要排序的元素个数,size表示每一个元素的大小。

那么 int (*compar)(const void*,const void*)表示什么呢?

他表示的是我们自己设计的判断数据大小的函数。因为qsort函数的设计者是不知道我们用到qsort函数的时候传入的是什么类型的数据。比如说:我们要比较两个int类型的数据的大小可以通过返回相减的结果是否大于0来判断大小,而char类型就不能这样判断。因此为了能够实现所有数据的排序,判断数据大小的函数需要我们自己去编写。

下面是compar函数的返回类型,若返回的值小于0,则a小于b、等于0,a,b相等、大于0,a大于b。

下面就给大家看看利用qsort来实现各种类型的排序。(int、char、结构体)

int类型:

//1、整型实现
int cmp_int(const void* e1,const void* e2)
{
	return (*(int*) e1 - *(int*) e2);
}

int main()
{
	int arr[] = { 1,5,2,3,4,8,6,9,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(int), cmp_int);
	for(int i = 0;i<sz;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

int类型的大小比较相对简单(上面也提到),我们直接返回两个数据相减的结果

char类型:

//字符串
int cmp_char(const void* e1,const void* e2)
{
	return strcmp((char*)e1, (char*)e2);
}
int main()
{
	char arr1[] = "edcba";
	//char arr2[] = "abcdefg";
	int sz = strlen(arr1);
	qsort(arr1,sz, sizeof(char), cmp_char);
	printf("%s ", arr1);
	return 0;
}

结构体类型:

//结构体比较大小
//姓名
struct peop
{
	char name[20];
	int age;

};
int cmp_stu_name(const void* e1,const void* e2)
{
	return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}
int main()
{
	struct peop p1[] = { "zhangsan",18,{"shangsi",19} };
	int sz = sizeof(p1) / sizeof(p1[0]);
	qsort(p1,sz, sizeof(struct peop), cmp_stu_name);
	return 0;
}
//年龄
int cmp_stu_age(const void* e1,const void* e2)
{
	return ((struct peop*)e1)->age - ((struct peop*)e2)->age;
}
int main()
{
	struct peop p1[] = { "zhangsan",18,{"shangsi",19} };
	int sz = sizeof(p1) / sizeof(p1[0]);
	qsort(p1, sz, sizeof(struct peop), cmp_stu_age);
	return 0;
}

下面我们就使用冒泡排序模拟实现qsort。

#include<stdio.h>
void Swap(char* buf1, char* buf2, int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void bubble_qsort(void* base, size_t num, size_t size, int (*com)(const void*, const void*))
{
	for(int i = 0;i<num-1;i++)
	{
		for(int j = 0;j<num-1-i;j++)
		{
			if(cmp((char*)base+j*size,(char*)base+(j+1)*size)>0)
			{
				swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
		}
	}
}
int cmp_int(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}
void print(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
}
void test4()
{
	int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
}
int main()
{
	test4();
	return 0;
}

ok,这就是我们今天所有的内容了,感谢大家的阅读!!!

若有错误请大佬指正! 

本文含有隐藏内容,请 开通VIP 后查看